2016-07-13 3 views
2

У меня есть сценарий, как это:Как я могу получить как исключения PDO, так и другие?

try { 
    $stm = $dbh->prepare("INSERT .. SELECT query"); 
    $stm->execute(); 
    if ($stm->rowCount() > 0) { 
     echo 'inserted'; 
    } else { 
     throw new Exception('No rows inserted'); 
    } 
} catch(Exception $e) { 
    echo $e; 
} 

Как вы видите, что catch блок просто обращается к Exception сек, что я набор. На самом деле мне также нужно получить доступ к исключению PDO. Что-то вроде этого:

} catch(Exception $e, PDOException $pdo) { 
    echo isset($pdo) ? "other message: " . $e : null; 
    echo isset($e) ? "PDO message: " . $pdo : null; 
} 

Как вы знаете, мой текущий синтаксис неверен. Я говорю о catch(Exception $e, PDOException $pdo). Ну, есть ли какое-нибудь обходное решение?

+0

Вы можете бросить экземпляр Exception PDO, и поймать блок только процесс PDOException. например, try {throw new PDOException («Нет вставленных строк»)} catch (PDOException $ e) {echo $ e-> getErrorMessage} –

+0

'Exception' также поймает' PDOException', поскольку последний наследует от первого. – deceze

+1

Я не уверен, что понимаю Q. Ваш блок catch уже настроен, чтобы поймать PDOException, если это произойдет, а также поймать вас. Они не будут возникать в одно и то же время, потому что для того, чтобы ваше исключение было брошено, операция PDO должна была завершиться без исключения исключения из своего собственного – BeetleJuice

ответ

4

Вы можете использовать несколько блоков уловах

catch(PDOException $pdo) { 
    echo $pdo; 
} 
catch(Exception $e) { 
    echo $e; 
} 

Или вы все еще можете сохранить один поймать блок и принять помощь от instanceof

catch(Exception $e) { 
    if($e instanceof PDOException) 
     // pdoexception 
    else 
     // others 
} 
+0

. Вы имеете в виду один 'try' и два' catch'? Это возможно? – Shafizadeh

+0

Да, конечно можно –

+0

Прохладный .. thx +1 ..! – Shafizadeh

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