2009-12-28 3 views
1

Пример: Я использую метод PDO, который генерирует исключение. Но внутри блока try я также бросаю собственное исключение, если что-то еще не так. Теперь я хочу отдельно обрабатывать PDOException и мое собственное исключение. Как я могу отделить это, чтобы он работал?Как поймать эти вложенные исключения?

public function prepare(string $sql, array $params) { 
    try { 
     $prepared = $this->dbh->prepare($sql); // may throw PDOException 
     $i = 1; 
     foreach ($params as $param) { 
     $ok = $prepared->bindParam($i, $param); 
     if (!$ok) { 
      throw new Exception("Unable to bind parameter (" . $param . ") to prepared statement: " . $sql); 
     } 
     $i++; 
     } 
    } catch (PDOException $e) { 
     throw new Exception("DB:prepare(): Could not prepare statement. " . $e->getMessage()); 
    } 
    return $prepared; 
    } 

Обратите внимание, что у меня есть глобальный обработчик ошибок, который заботится о регистрации каких-либо исключений в файле. Вот почему я бросаю свои собственные исключения вместо того, чтобы писать непосредственно в файл журнала (таким образом, я получаю также обратную трассировку).

ответ

7

Вы можете использовать несколько catch блоков, как это:

try { 
    // ... 
} catch (PDOException $e) { 
    // Handle the PDOException, with some specific code 
} catch (Exception $e) { 
    // Handle any other kind of Exception 
    // that has not already been catched by 
    // one of the previous(es) catch block 
} 

Но заметьте, вы должны поставить «самый специфическое» исключение типа первого - что означает Exception должен быть последней.


Вот несколько статей/блог-постов, которые могут вас заинтересовать, о исключениях и PHP:

1

Несколько catch es? Или поймайте только Exception и проверьте его тип.

Смежные вопросы