Try / Catch block в PHP не ловит Исключение

Я пытаюсь запустить этот пример # 1 с этой страницы: http://php.net/manual/en/language.exceptions.php

<?php function inverse($x) { if (!$x) { throw new Exception('Division by zero.'); } return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } // Continue execution echo "Hello World\n"; ?> 

Однако вместо желаемого результата я получаю:

 0.2 Fatal error: Uncaught exception 'Exception' with message 'Division by zero.' in xxx: 7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7 

В качестве среды разработки я использую UniServer 3.5 с PHP 5.2.3

У меня просто была эта точная проблема, когда мне показалось, что я даже скопировал название исключения, но все же не поймал его. Оказалось, что это была моя глупая ошибка, но я думал, что должен опубликовать свой случай здесь, если в той же ситуации есть кто-то другой.

У меня было мое исключение в моем пространстве имен под названием A, и скрипт находился в пространстве имен B. Проблема заключалась в том, что у меня было A \ MyException, которое равно (в PHP) \ B \ A \ MyException (потому что мой скрипт находится в пространстве имен B !). Все, что я должен был сделать, чтобы исправить это, заключалось в том, чтобы добавить к имени исключения обратную косую черту (или что-то еще), чтобы она выглядела так: \ A \ MyException

Довольно старый вопрос, но …

У меня тоже была эта проблема (и так я нашел этот пост), но простой эксперимент позволил мне найти решение. Просто попробуйте изменить Exception в \Exception . Работал для меня!

РЕДАКТИРОВАТЬ:

Как указал Сиванн в комментариях, использование пространства имен должно делать то же самое. Поэтому просто use \Exception as Exception; перед объявлением класса.

Вы не можете использовать типичные блоки try {} catch {} в PHP, как вы могли бы сделать на другом языке, таком как C # (Csharp).

Если вы это сделаете:

 try{ //division by zero $number = 5/0; } catch(Exception $ex){ echo 'Got it!'; } 

Вы не увидите «Получил»! сообщение никогда. Зачем? Это просто потому, что PHP всегда нуждается в исключении, которое будет «Брошено». Вам нужно установить свой собственный обработчик ошибок и выбросить с ним исключение.

См. Функцию set_error_handler : http://php.net/manual/es/function.set-error-handler.php

Попробуйте поместить catch(\Exception $e) вместо catch(Exception $e) . Если вы используете код, который вы не знаете об этом очень хорошо, или, особенно – если вы используете фреймворк, он может переопределить PHP Exception по умолчанию одним из своих, и, следовательно, вы можете пойти по неправильному пути и получить нежелательный результат. Если вы просто положили \Exception , тогда вы уверены, что поймаете базовое исключение PHP.

Вы не используете идентичный код, иначе исключение будет выбрано в строке 4 вместо 7. Какой код вы используете точно?

Мой первоначальный, хотя у вас есть опечатка во имя исключения, которое вы ловите / бросаете, но если ваш код точно такой же, я точно не знаю, что происходит.

Попробуйте выполнить следующую модификацию исходного сценария и вставьте свои результаты. Это поможет немного улучшить вашу проблему.

 <?php //set up exception handler to report what we didn't catch function exception_handler($exception) { if($exception instanceof MyException) { echo "you didn't catch a myexception instance\n"; } else if($exception instanceof Exception) { echo "you didn't catch a exception instance\n"; } else { echo "uncaught exception of type: ".gettype($exception)."\n"; } echo "Uncaught exception: " , $exception->getMessage(), "\n"; } //install the handler set_exception_handler('exception_handler'); class MyException extends Exception { } function inverse($x) { if (!$x) { throw new MyException('Division by zero.'); } else return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (MyException $e) { echo 'Caught myexception: ', $e->getMessage(), "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } // Continue execution echo 'Hello World'; ?> 

У меня была та же проблема со следующими конфигурациями,

PHP 5.2.14 (cli) (построено: 12 августа 2010 г. 17:32:30) Copyright (c) 1997-2010 PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies с eAccelerator v0.9.5. 1 , Авторское право (c) 2004-2006 eAccelerator, by eAccelerator

Решение состоит в том, чтобы отключить eAccelerator или обновить его. Я попробовал оба, и оба исправления работали. Об ошибке сообщается здесь https://eaccelerator.net/ticket/242 (NB. Firefox жалуется на их сертификат SSL).

Теперь я запускаю try catch правильно со следующими конфигурациями,

PHP 5.2.4 (cli) (построено: 16 октября 2007 г. 09:13:35) Copyright (c) 1997-2007 PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies с eAccelerator v0.9.6. 1 , Авторское право (c) 2004-2010 eAccelerator, by eAccelerator

в Xdebug есть настройка:

 xdebug.show_exception_trace = 1 

Это заставит php выводить исключения даже в блок catch try. Поверните это на 0

Может быть, попробуйте отключить некоторые сторонние расширения, которые вы, возможно, установили? http://bugs.php.net/bug.php?id=41744