Try true false php

Исключения

В PHP реализована модель исключений, аналогичная тем, что используются в других языках программирования. Исключение в PHP может быть выброшено ( throw ) и поймано ( catch ). Код может быть заключён в блок try , чтобы облегчить обработку потенциальных исключений. У каждого блока try должен быть как минимум один соответствующий блок catch или finally .

Если выброшено исключение, а в текущей области видимости функции нет блока catch , исключение будет «подниматься» по стеку вызовов к вызывающей функции, пока не найдёт подходящий блок catch . Все блоки finally , которые встретятся на этом пути, будут выполнены. Если стек вызовов разворачивается до глобальной области видимости, не встречая подходящего блока catch , программа завершается с неисправимой ошибкой, если не был установлен глобальный обработчик исключений.

Выброшенный объект должен наследовать ( instanceof ) интерфейс Throwable . Попытка выбросить объект, который таковым не является, приведёт к неисправимой ошибке PHP.

Начиная с PHP 8.0.0, ключевое слово throw является выражением и может быть использовано в любом контексте выражения. В предыдущих версиях оно было утверждением и должно было располагаться в отдельной строке.

catch

Блок catch определяет, как реагировать на выброшенное исключение. Блок catch определяет один или несколько типов исключений или ошибок, которые он может обработать, и, по желанию, переменную, которой можно присвоить исключение (указание переменной было обязательно до версии PHP 8.0.0). Первый блок catch , с которым столкнётся выброшенное исключение или ошибка и соответствует типу выброшенного объекта, обработает объект.

Несколько блоков catch могут быть использованы для перехвата различных классов исключений. Нормальное выполнение (когда исключение не выброшено в блоке try ) будет продолжаться после последнего блока catch , определённого в последовательности. Исключения могут быть выброшены ( throw ) (или повторно выброшены) внутри блока catch . В противном случае выполнение будет продолжено после блока catch , который был вызван.

При возникновении исключения, код, следующий за утверждением, не будет выполнен, а PHP попытается найти первый подходящий блок catch . Если исключение не поймано, будет выдана неисправимая ошибка PHP с сообщением » Uncaught Exception . «, если только обработчик не был определён с помощью функции set_exception_handler() .

Начиная с версии PHP 7.1.0, в блоке catch можно указывать несколько исключений, используя символ | . Это полезно, когда разные исключения из разных иерархий классов обрабатываются одинаково.

Начиная с версии PHP 8.0.0, имя переменной для пойманного исключения является необязательным. Если оно не указано, блок catch будет выполнен, но не будет иметь доступа к выброшенному объекту.

finally

Блок finally также может быть указан после или вместо блоков catch . Код в блоке finally всегда будет выполняться после блоков try и catch , независимо от того, было ли выброшено исключение и до возобновления нормального выполнения.

Одно из заметных взаимодействий происходит между блоком finally и оператором return . Если оператор return встречается внутри блоков try или catch , блок finally всё равно будет выполнен. Более того, оператор return выполнится, когда встретится, но результат будет возвращён после выполнения блока finally . Кроме того, если блок finally также содержит оператор return , возвращается значение из блока finally .

Читайте также:  Готовая форма php mysql

Глобальный обработчик исключений

Если исключению разрешено распространяться на глобальную область видимости, оно может быть перехвачено глобальным обработчиком исключений, если он установлен. Функция set_exception_handler() может задать функцию, которая будет вызвана вместо блока catch , если не будет вызван никакой другой блок. Эффект по сути такой же, как если бы вся программа была обёрнута в блок try — catch с этой функцией в качестве catch .

Примечания

Замечание:

Внутренние функции PHP в основном используют отчёт об ошибках, только современные объектно-ориентированные модули используют исключения. Однако ошибки можно легко перевести в исключения с помощью класса ErrorException. Однако эта техника работает только с исправляемыми ошибками.

Пример #1 Преобразование отчётов об ошибках в исключения

function exceptions_error_handler ( $severity , $message , $filename , $lineno ) throw new ErrorException ( $message , 0 , $severity , $filename , $lineno );
>

Примеры

Пример #2 Выбрасывание исключения

function inverse ( $x ) if (! $x ) throw new Exception ( ‘Деление на ноль.’ );
>
return 1 / $x ;
>

try echo inverse ( 5 ) . «\n» ;
echo inverse ( 0 ) . «\n» ;
> catch ( Exception $e ) echo ‘Выброшено исключение: ‘ , $e -> getMessage (), «\n» ;
>

// Продолжение выполнения
echo «Привет, мир\n» ;
?>

Результат выполнения данного примера:

0.2 Выброшено исключение: Деление на ноль. Привет, мир

Пример #3 Обработка исключений с помощью блока finally

function inverse ( $x ) if (! $x ) throw new Exception ( ‘Деление на ноль.’ );
>
return 1 / $x ;
>

try echo inverse ( 5 ) . «\n» ;
> catch ( Exception $e ) echo ‘Поймано исключение: ‘ , $e -> getMessage (), «\n» ;
> finally echo «Первый блок finally.\n» ;
>

try echo inverse ( 0 ) . «\n» ;
> catch ( Exception $e ) echo ‘Поймано исключение: ‘ , $e -> getMessage (), «\n» ;
> finally echo «Второй блок finally.\n» ;
>

// Продолжение нормального выполнения
echo «Привет, мир\n» ;
?>

Результат выполнения данного примера:

0.2 Первый блок finally. Поймано исключение: Деление на ноль. Второй блок finally. Привет, мир

Пример #4 Взаимодействие между блоками finally и return

function test () try throw new Exception ( ‘foo’ );
> catch ( Exception $e ) return ‘catch’ ;
> finally return ‘finally’ ;
>
>

Результат выполнения данного примера:

Пример #5 Вложенные исключения

class MyException extends Exception

class Test public function testing () try try throw new MyException ( ‘foo!’ );
> catch ( MyException $e ) // повторный выброс исключения
throw $e ;
>
> catch ( Exception $e ) var_dump ( $e -> getMessage ());
>
>
>

$foo = new Test ;
$foo -> testing ();

Результат выполнения данного примера:

Пример #6 Обработка нескольких исключений в одном блоке catch

class MyException extends Exception

class MyOtherException extends Exception

class Test public function testing () try throw new MyException ();
> catch ( MyException | MyOtherException $e ) var_dump ( get_class ( $e ));
>
>
>

Читайте также:  Css coding link color

$foo = new Test ;
$foo -> testing ();

Результат выполнения данного примера:

Пример #7 Пример блока catch без указания переменной

Допустимо начиная с PHP 8.0.0

class SpecificException extends Exception <>

function test () throw new SpecificException ( ‘Ой!’ );
>

try test ();
> catch ( SpecificException ) print «Было поймано исключение SpecificException, но нам безразлично, что у него внутри.» ;
>
?>

Пример #8 Throw как выражение

Допустимо начиная с PHP 8.0.0

function test () do_something_risky () or throw new Exception ( ‘Всё сломалось’ );
>

try test ();
> catch ( Exception $e ) print $e -> getMessage ();
>
?>

User Contributed Notes 14 notes

If you intend on creating a lot of custom exceptions, you may find this code useful. I’ve created an interface and an abstract exception class that ensures that all parts of the built-in Exception class are preserved in child classes. It also properly pushes all information back to the parent constructor ensuring that nothing is lost. This allows you to quickly create new exceptions on the fly. It also overrides the default __toString method with a more thorough one.

interface IException
/* Protected methods inherited from Exception class */
public function getMessage (); // Exception message
public function getCode (); // User-defined Exception code
public function getFile (); // Source filename
public function getLine (); // Source line
public function getTrace (); // An array of the backtrace()
public function getTraceAsString (); // Formated string of trace

/* Overrideable methods inherited from Exception class */
public function __toString (); // formated string for display
public function __construct ( $message = null , $code = 0 );
>

abstract class CustomException extends Exception implements IException
protected $message = ‘Unknown exception’ ; // Exception message
private $string ; // Unknown
protected $code = 0 ; // User-defined exception code
protected $file ; // Source filename of exception
protected $line ; // Source line of exception
private $trace ; // Unknown

public function __construct ( $message = null , $code = 0 )
if (! $message ) throw new $this ( ‘Unknown ‘ . get_class ( $this ));
>
parent :: __construct ( $message , $code );
>

public function __toString ()
return get_class ( $this ) . » ‘ < $this ->message > ‘ in < $this ->file > ( < $this ->line > )\n»
. » < $this ->getTraceAsString ()> » ;
>
>
?>

Now you can create new exceptions in one line:

class TestException extends CustomException <>
?>

Here’s a test that shows that all information is properly preserved throughout the backtrace.

function exceptionTest ()
try throw new TestException ();
>
catch ( TestException $e ) echo «Caught TestException (‘ < $e ->getMessage ()> ‘)\n < $e >\n» ;
>
catch ( Exception $e ) echo «Caught Exception (‘ < $e ->getMessage ()> ‘)\n < $e >\n» ;
>
>

echo ‘

' . exceptionTest () . '

‘ ;
?>

Here’s a sample output:

Caught TestException (‘Unknown TestException’)
TestException ‘Unknown TestException’ in C:\xampp\htdocs\CustomException\CustomException.php(31)
#0 C:\xampp\htdocs\CustomException\ExceptionTest.php(19): CustomException->__construct()
#1 C:\xampp\htdocs\CustomException\ExceptionTest.php(43): exceptionTest()
#2

Читайте также:  Getting Started: Serving Web Content

Источник

Try Catch PHP или исключения в PHP

Представляем вашему вниманию руководство для новичков о том, как использовать блоки Try Catch PHP . В этой статье я покажу, как перехватывать исключения.

Давайте сразу взглянем на пример сгенерированного исключения ( и впоследствии перехваченного ):

 > //Перехватываем (catch) исключение, если что-то идет не так. catch (Exception $ex) < //Выводим сообщение об исключении. echo $ex->getMessage(); >

В приведенном выше примере я продемонстрировал использование TRY и CATCH , в котором исключение всегда сгенерировано ( только ради примера ):

  1. Внутри блока TRY мы проверяем, равняется ли цифра 1 цифре 2 . Так как она не равняется ( и никогда не будет равняться ), мы генерируем исключение с сообщением “ 1 не равняется 2! ”;
  2. Внутри блока CATCH мы перехватываем исключение и выводим соответствующее сообщение.
  • TRY : внутри блока PHP try мы задаем логику приложения. Этот блок содержит код, который может или не может сгенерировать исключение;
  • CATCH : блок CATCH будет перехватывать любые исключения, проявившиеся в предыдущем блоке TRY . Код внутри блока CATCH будет исполнен только в случае обнаружения исключения;
  • FINALLY : если вы используете PHP 5.5 и выше, то вы можете использовать блок FINALLY . Расположенный в нем код исполняется всегда, вне зависимости от того, было ли обнаружено исключение.

Когда используются исключения?

Исключения используются, когда результат операции отличается от того, что ожидало ваше приложение. К примеру, если ваше приложение пытается прочитать CSV-файл на сервере, а этого файла не существует, то можно сгенерировать исключение. Использование PHP try catch в примере:

 > //Перехватываем (catch) исключение, если что-то идет не так. catch (Exception $ex) < //Выводим сообщение об исключении. echo $ex->getMessage(); >

В приведенном выше примере использования в PHP try exception мы генерируем исключение тогда, когда не можем открыть запрашиваемый файл. И генерируем мы его, так как файл должен был существовать. Примеры ситуаций, когда вы можете генерировать исключения:

  1. Ваше PHP-приложение не может подключиться к MySQL ;
  2. Ошибка при запросе к базе данных;
  3. Ошибка при запросе к API ;
  4. Получен некорректный тип запроса;
  5. Отсутствуют необходимые переменные $_POST или $_GET .

Нужно ли перехватывать все исключения?

Лично я так не считаю. К примеру: вам не удается подключиться к базе данных, и генерируется исключение, нужно ли тогда исполнять весь оставшийся код? Если весь последующий код привязан к базе данных, которой просто не существует, то зачем же его исполнять?

По моему мнению, исключения нужно перехватывать с помощью PHP try catch finally только, если это не оказывает негативного влияния на остальные функции приложения.

Например: если API-запрос к внешнему сервису выдает ошибку, то вы можете перехватить исключение и вывести дружественное пользователю сообщение « Невозможно подключиться к базе данных » или « Информация о погоде недоступна ».

Не перехваченные исключения следует обрабатывать с помощью пользовательского обработчика. Так вы сможете обрабатывать не перехваченные исключения, и выводить понятные человеку сообщения или заглушки.

Источник

Оцените статью