PHP尝试,捕获,然后再试一次(取决于输出)?

时间:2014-08-12 20:09:35

标签: php class exception try-catch

我目前有以下PHP,它使用try / catch块检查异常。

try {
    $obj->login('User', 'Pass');
    $obj->joinServer('Server');
} catch(ConnectionException $objException){
    die();
}

...这是ConnectionException类:

class ConnectionException extends Exception {

    public function __construct($strError, $intError, $mixOther = null){
        $this->strError = $strError;
        $this->intError = $intError;

        echo $this->intError, ' - ', $this->strError, chr(10);
    }

}

现在让我们假设“catch”部分返回特定错误(如果ConnectionException输出特定消息),我该如何再次“重试”try / catch?

3 个答案:

答案 0 :(得分:0)

我想你可以嵌套try/catch,将代码包装成函数以避免代码重复:

function login($obj){
    $obj->login('User', 'Pass');
    $obj->joinServer('Server');
}


try {
    login($obj);
} catch(ConnectionException $objException){
    try {
        login($obj);
    } catch(ConnectionException $objException){
        die();
    }
}

答案 1 :(得分:0)

如果你想在这个级别执行此操作,而不是每次都抛出一个ConnectionException,抛出一个不同的异常,即ConnectionException的子类,表示你想要什么时候重新运行逻辑。然后,将try中的逻辑封装到函数中,然后再次调用它。

try {
    doWork( $obj);
} catch( ConnectionTimeoutException $e) {
    // Wait a bit, then retry
    try {
        sleep(10);
        doWork( $obj);
    } catch( ConnectionException $e) {
        // Because of the subclass, this would catch both ConnectionException and ConnectionTimeoutException
        die();
    }
} catch( ConnectionException $e) {
    die();
}

您还可以更改您调用此功能的方式,并根据ConnectionException的结果调用两次。虽然,以这种方式,将此决定建立在返回值而不是异常上可能更有意义。

答案 2 :(得分:0)

我的建议是创建一个简单的while循环来检查条件:

    try_connection = true;
    while(try_connection) {
      try {
        $obj->login('User', 'Pass');
        $obj->joinServer('Server');
      } catch(ConnectionException $objException){
        if(!specific_message)
          try_connection = false;
      }
    }