2013-05-31 2 views
0

Пусть один имеет следующий код:Что происходит с автоматически пойманным исключением?

try { 
    $i = 0; 
    while ($i < 10) { 
     if ($i == 7) { 
      throw new Exception("Test exception"); 
     } 
     $i++; 
    } 
} catch (Exception $e) { 
} 
print($i); 

Это будет возвращать 7. Когда первое исключение в блоке try поймано, программа выполнит блок catch, а затем продолжит работу над этим блоком (а не?).

Однако, что происходит, когда я устанавливаю автоматический обработчик исключений (с set_exception_handler())? Когда я запускаю этот код, я не получаю возвращаемое значение:

function the_handler($e) { 
} 
set_exception_handler('the_handler'); 
$i = 0; 
while ($i < 10) { 
    if ($i == 7) { 
     //throw new Exception("Test exception"); 
    } 
    $i++; 
} 
print($i); 

Почему это? Что именно происходит после вызова обработчика исключений?

+0

'set_exception_handler()' is not 'catch' exceptions, он определяет поведение PHP после возникновения * uncaught * exception. Обычно это означает неудачное изложение и не показывает пользователю трассировку стека, полную данных, которые вы, возможно, не захотите опубликовать. – Sammitch

+0

@ Да, это плохо, английский не мой родной язык. – Keelan

ответ

1

PHP manual говорит:

Выполнение остановится после того, как exception_handler называется.

См. Обсуждение на странице руководства для многих особых случаев, например. когда вы бросаете исключение в обработчик исключений.

+0

Хм, я полностью пропустил это. Извиняюсь! (Я думаю, что нет обходного пути?) – Keelan

+0

@CamilStaps IMO не имеет смысла обеспечивать обходное решение, поскольку как обрабатывать исключение является специфическим для потока, в котором оно выбрано. Конструкция 'try ... catch' - намного лучший инструмент для восстановления из-за исключений. – gzm0

+0

@ gzm0 всем сердцем согласен ... это просто позволяет вам сделать что-то не так легко (обработка ошибок покемона) – Orangepill

Смежные вопросы