我的script_a.php
:
try {
Class1::tryThis();
}
catch (Exception $e) {
// Do stuff here to show the user an error occurred
}
Class1::tryThis()
有类似的内容:
public function tryThis() {
Class2::tryThat();
self::logSuccessfulEvent();
}
问题是Class2::tryThat()
可能会抛出异常。
如果它确实抛出异常,似乎行[{1}}仍然被执行。
如何重构此代码,以便self::logSuccessfulEvent();
仅在未引发异常时发生,但同时让self::logSuccessfulEvent()
知道何时抛出异常 ?
答案 0 :(得分:5)
此函数将返回操作是否成功(true =成功,false =失败)
public function tryThis() {
$success = true;
try {
Class2::tryThat();
self::logSuccessfulEvent();
} catch( Exception $e) {
$success = false;
}
return $success;
}
答案 1 :(得分:2)
您所描述的内容似乎并非如此。
代码:
<?php
class Class1 {
public function tryThis() {
echo "Class1::tryThis() was called.\n";
Class2::tryThat();
self::logSuccessfulEvent();
}
public function logSuccessfulEvent() {
echo "Class1::logSuccessfulEvent() was called.\n";
}
}
class Class2 {
public function tryThat() {
echo "Class2::tryThat() was called.\n";
throw new Exception('Exception generated in Class2::tryThat()');
}
}
try {
Class1::tryThis();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
输出:
Class1::tryThis() was called.
Class2::tryThat() was called.
Exception generated in Class2::tryThat()
正如您所看到的,Class1::logSuccessfulEvent()
方法在Class2::tryThat()
中生成异常时永远不会执行,它也不应该(也不会)。异常冒泡,直到它们被捕获或产生致命错误。一旦捕获到异常,程序的控制将返回catch
块之后的代码。在这种特殊情况下,这意味着程序的控制永远不会到达记录方法。