首先,应该明确一个异常只有在没有被捕获的情况下才是致命的。捕获异常不会停止脚本执行。它只是停止 try 块中的堆栈帧并将控制权转移到 catch 块。从那里您的脚本将继续正常执行。
通过在这里捕获异常,我们仍然在捕获异常后恢复正常的脚本执行......
try {
echo "Try...\n";
throw new Exception("This is an exception");
} catch(Exception $e) {
echo "Exception caught with message: " . $e->getMessage() . "\n";
}
echo "Script is still running...";
还有另一种处理未捕获异常的方法,使用异常处理程序。但是,如果您不使用 try 和 catch 语句,执行流程仍将停止。这是异常的性质:
function myExceptionHandler($e) {
echo "Uncaught exception with message: " , $e->getMessage(), "\n";
}
set_exception_handler('myExceptionHandler'); // Registers the exception handler
throw new Exception("This is Exception 1");
echo "Execution never gets past this point";
throw new Exception("This is Exception 2");
throw new Exception("This is Exception 3");
编辑:澄清你的问题后,我认为我应该说明你想要的不是异常处理程序,但你实际上根本不想使用异常。您正在尝试做的事情根本不需要抛出异常。如果您打算做的只是处理这样的错误,请不要将 PDO 置于异常模式。异常应该只用于处理异常错误。例外的全部意义在于确保你信守诺言。例如,如果您的函数承诺它将始终返回一个 PDOStatement 对象,并且在某些情况下它不可能做到这一点,那么抛出异常是有意义的。这让调用者知道我们已经到了无法兑现承诺的地步。
你想要的是基本的错误处理......
function someCode(){
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
return $pdostmt->fetchAll($this->fetchOption);
elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
return $pdostmt->rowCount();
} else {
return false;
}
}
while (someCode() === false) {
/* Call someCode() until you get what you want */
}