【问题标题】:PHP try, catch, and try again (depending on output)?PHP 尝试、捕获并再次尝试(取决于输出)?
【发布时间】:2014-10-06 01:11:00
【问题描述】:

我目前有以下 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?

【问题讨论】:

标签: php class exception try-catch


【解决方案1】:

我猜你可以嵌套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();
    }
}

【讨论】:

    【解决方案2】:

    如果您想在此级别执行此操作,而不是让它每次都抛出 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 的结果调用它两次。尽管以这种方式,基于返回值而不是异常来做出此决定可能更有意义。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-24
        相关资源
        最近更新 更多