PHP 5.5 finally
реализовал try-catch
. Я сомневаюсь: когда именно try-catch-finally
это может быть более полезно, чем просто написать ниже try-catch
?
Пример: разница между:
try { something(); } catch(Exception $e) { other(); } finally { another(); }
Вместо этого просто:
try { something(); } catch(Exception $e) { other(); } another();
Могу отправить мне пример, который является общим для этого случая?
Примечания :
try-catch-finally
, а не о try-finally
, только; finally
; notcatch
? Поэтому я могу запускать код, если try
идет без исключения. хе-хе Код в блоке finally
всегда выполняется после выхода из блоков try
или catch
. Конечно, вы можете продолжить писать код после try-catch, и он также будет выполнен. Но, наконец, может быть полезно, когда вы хотите вырваться из выполнения кода (например, возврат из функции, выход из цикла и т. Д.). Вы можете найти несколько примеров на этой странице – http://us2.php.net/exceptions , например:
function example() { try { // open sql connection // Do regular work // Some error may happen here, raise exception } catch (Exception $e){ return 0; // But still close sql connection } finally { //close the sql connection //this will be executed even if you return early in catch! } }
Но да, вы правы; finally
, не очень популярна в повседневном использовании. Конечно, это не так много, как попытка-ловушка.
Вы не можете поймать исключение, которое вы бросаете, но вы все еще хотите запустить свой finally
оператор перед тем, как выбросить ошибку (например, всегда закрывайте файл журнала или соединение с БД до смертельного сбоя, потому что вы не заметили исключение):
<?php $fHandle = fopen('log.txt', 'a'); try { echo 'Throwing exception..'; fwrite($fHandle, 'Throwing exception..'); throw new BadFunctionCallException(); } catch (RangeException $e) { // We only want to log RangeExceptions echo 'Threw a RangeException: ' . $e->getMessage(); fwrite($fHandle, 'Threw a RangeException: ' . $e->getMessage()); } finally { // Always make sure that we close the file before throwing an exception, even if we don't catch it echo 'Reached the finally block'; fwrite($fHandle, 'Reached the finally block'); fclose($fHandle); }
Что будет выводить:
Throwing exception..Reached the finally block Fatal error: Uncaught exception 'BadFunctionCallException' in /tmp/execpad-dc59233db2b0/source-dc59233db2b0:6 Stack trace: #0 {main} thrown in /tmp/execpad-dc59233db2b0/source-dc59233db2b0 on line 6
DEMO (без fopen
поскольку eval.in
его не поддерживает)