考虑以下两个例子
<?php
function throw_exception() {
// Arbitrary code here
throw new Exception('Hello, Joe!');
}
function some_code() {
// Arbitrary code here
}
try {
throw_exception();
} catch (Exception $e) {
echo $e->getMessage();
}
some_code();
// More arbitrary code
?>
和
<?php
function throw_exception() {
// Arbitrary code here
throw new Exception('Hello, Joe!');
}
function some_code() {
// Arbitrary code here
}
try {
throw_exception();
} catch (Exception $e) {
echo $e->getMessage();
} finally {
some_code();
}
// More arbitrary code
?>
有什么区别?是否存在第一个示例不会执行some_code()
,但第二个会执行的情况?我是不是完全没有抓住要点?
如果捕获Exception(任何异常),则两个代码示例是等效的。但是,如果您只处理类块中的某些特定异常类型,并且发生了另一种异常,那么只有在有finally
块的情况下才会执行some_code();
。
try {
throw_exception();
} catch (ExceptionTypeA $e) {
echo $e->getMessage();
}
some_code(); // Will not execute if throw_exception throws an ExceptionTypeB
但是:
try {
throw_exception();
} catch (ExceptionTypeA $e) {
echo $e->getMessage();
} finally {
some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB
}
当您希望执行一段代码时,无论是否发生异常,都会使用法定块。。。
查看本页示例2:
PHP手动
Finally将触发,即使没有捕获到异常。
试试这个代码看看为什么:
<?php
class Exep1 extends Exception {}
class Exep2 extends Exception {}
try {
echo 'try ';
throw new Exep1();
} catch ( Exep2 $e)
{
echo ' catch ';
} finally {
echo ' finally ';
}
echo 'aftermath';
?>
输出将是
try finally
Fatal error: Uncaught exception 'Exep1' in /tmp/execpad-70360fffa35e/source-70360fffa35e:7
Stack trace:
#0 {main}
thrown in /tmp/execpad-70360fffa35e/source-70360fffa35e on line 7
这是给你的小提琴。https://eval.in/933947
来自PHP手册:
在PHP 5.5及更高版本中,也可以在catch块之后指定finally区块,或者不指定catch区块。finally块中的代码将始终在try和catch区块之后执行,无论是否引发异常,以及在恢复正常执行之前执行。
请参阅手册中的此示例,了解其工作原理。
http://www.youtube.com/watch?v=EWj60p8esD0
观看时间:12:30以后
观看此视频。不过语言是JAVA。但我认为它很好地说明了Exceptions和关键字的使用。