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

I currently have the following PHP which uses a try/catch block checking for exceptions.

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

...and this is the ConnectionException class:

class ConnectionException extends Exception {

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

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

}

Now let's say if the "catch" part returns a specific error (if ConnectionException outputs a specific message), how can I "retry" the try/catch again?

I guess you can nest the try/catch, wrap it the code into a function to avoid code repetition:

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


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

If you want to do this at this level, instead of having it throw a ConnectionException every time, throw a different exception that's a subclass of ConnectionException that signifies when you would want to rerun the logic. Then, encapsulate the logic that you have within the try to a function, and call it again.

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();
}

You can also change how you're calling this function, and call it twice depending on the result of ConnectionException. Although, in that manner, it may make more sense to base this decision on a return value instead of an Exception.

My suggestion would be to create a simple while loop that checks for a condition:

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