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 его не поддерживает)