Aktualisieren:
Ab PHP 7.1 ist dies verfügbar.
Die Syntax lautet:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Dokumente: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Festschreiben: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Für PHP vor 7.1:
Ungeachtet dessen, was diese anderen Antworten sagen, können Sie AError
und BError
im selben Block fangen (es ist etwas einfacher, wenn Sie derjenige sind, der die Ausnahmen definiert). Selbst wenn es Ausnahmen gibt, durch die Sie "fallen" möchten, sollten Sie dennoch in der Lage sein, eine Hierarchie zu definieren, die Ihren Anforderungen entspricht.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Dann:
catch(LetterError $e){
//voodoo
}
Wie Sie hier und hier sehen können , haben selbst die SPL
Standardausnahmen eine Hierarchie, die Sie nutzen können. Zusätzlich, wie im PHP-Handbuch angegeben :
Wenn eine Ausnahme ausgelöst wird, wird der auf die Anweisung folgende Code nicht ausgeführt, und PHP versucht, den ersten übereinstimmenden catch-Block zu finden.
Das heißt, Sie könnten auch haben
class CError extends LetterError {}
die Sie anders als AError
oder behandeln müssen BError
, damit Ihre catch-Anweisung folgendermaßen aussehen würde:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Wenn Sie den Fall hatten, dass es zwanzig oder mehr Ausnahmen gab, die rechtmäßig zu derselben Oberklasse gehörten, und Sie fünf (oder eine große Gruppe) davon auf die eine und den Rest auf die andere Weise behandeln mussten, können Sie dies NOCH tun.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Und dann:
catch (Group1 $e) {}
Die Verwendung von OOP bei Ausnahmen ist sehr leistungsfähig. Die Verwendung von Dingen wie get_class
oder instanceof
sind Hacks und sollte nach Möglichkeit vermieden werden.
Eine andere Lösung, die ich hinzufügen möchte, besteht darin, die Ausnahmebehandlungsfunktion in eine eigene Methode zu integrieren.
Du könntest haben
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
Unter der Annahme , es gibt absolut keine Möglichkeit, Ausnahmeklassenhierarchien oder Schnittstellen steuern kann (und fast immer wird ein Weg sein), können Sie Folgendes tun:
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
Auf diese Weise haben Sie immer noch einen einzigen Code-Speicherort, den Sie ändern müssen, wenn sich Ihr Ausnahmebehandlungsmechanismus ändern muss, und Sie arbeiten innerhalb der allgemeinen Konstrukte von OOP.