Zunächst einmal sollte man sich klar machen, dass eine Ausnahme nur fatal ist, wenn es nicht gefangen wird. Das Abfangen einer Ausnahme bewirkt nicht Skriptausführung anhalten. Es stoppt lediglich den Stapelrahmen im try-Block und übergibt die Kontrolle an den catch-Block. Von dort wird das Skript weiterhin normal ausgeführt.
Durch das Abfangen der Ausnahme hier sind wir wieder noch normal Skriptausführung nachdem die Ausnahme gefangen ...
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...";
Was Sie wollen, ist ein exception handler. Um eine Exception-Handler zu verwenden, so dass Sie jede Ausnahme nicht in try
/catch
Blöcke behandeln müssen Sie folgendes tun ...
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");
throw new Exception("This is Exception 2");
throw new Exception("This is Exception 3");
echo "The script is still running...";
Edit: Nach Klärung Ihrer Frage denke ich, dass ich sagen sollte Was Sie wollen, ist kein Ausnahme-Handler, aber Sie möchten überhaupt keine Ausnahmen verwenden. Was Sie versuchen zu tun, erfordert nicht, Ausnahmen zu werfen. Setzen Sie PDO nicht in den Ausnahme-Modus, wenn Sie nur den Fehler so behandeln wollen. Ausnahme sollte nur verwendet werden, um außergewöhnliche Fehler zu behandeln. Der springende Punkt einer Ausnahme ist, sicherzustellen, dass Sie Ihr Versprechen halten. Zum Beispiel, wenn Ihre Funktion verspricht, dass sie immer ein PDOStatement-Objekt zurückgibt und es einen Fall gibt, in dem das unmöglich ist, dann ist es sinnvoll, eine Ausnahme auszulösen. Dadurch weiß der Anrufer, dass wir einen Punkt erreicht haben, an dem wir unser Versprechen nicht halten können.
Was möchten Sie grundlegende Fehlerbehandlung ist ...
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 */
}
Können Sie ein Beispiel geben, was Sie zu tun versuchen? Vielleicht hilft das Refactoring. –
Code, oder es ist nicht geschehen. – moonwave99
Ein 'try' Block kann viele Anweisungen enthalten. Es ist möglich herauszufinden, welcher die Ausnahme ausgelöst hat, aber es ist nicht trivial. Was versuchst du zu erreichen? –