处理异常,仅在未抛出异常时执行代码

时间:2012-03-13 16:27:05

标签: php exception-handling try-catch

我的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()知道何时抛出异常

2 个答案:

答案 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块之后的代码。在这种特殊情况下,这意味着程序的控制永远不会到达记录方法。