更新:
PHP 7.1以降、これは利用可能です。
構文は次のとおりです。
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
ドキュメント:https : //www.php.net/manual/en/language.exceptions.php#example-287
RFC:https : //wiki.php.net/rfc/multiple-catch
コミット:https : //github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
7.1より前のPHPの場合:
これらの他の回答が言うことにもかかわらず、あなたがキャッチすることができますAError
し、BError
同じブロック内で(あなたが例外を定義する1であれば、それはいくらか容易です)。「フォールスルー」したい例外があるとしても、ニーズに合わせて階層を定義できるはずです。
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
次に:
catch(LetterError $e){
//voodoo
}
こことここを見るとわかるように、SPL
デフォルトの例外にも、利用できる階層があります。さらに、PHPマニュアルに記載されているように:
例外がスローされると、ステートメントに続くコードは実行されず、PHPは最初に一致するcatchブロックを見つけようとします。
これは、
class CError extends LetterError {}
AError
orとBError
は異なる方法で処理する必要があるため、catchステートメントは次のようになります。
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
同じスーパークラスに正当に属している例外が20個以上あり、そのうちの5つ(または大規模なグループ)を一方の方法で処理し、残りをもう一方の方法で処理する必要がある場合でも、これを実行できます。
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
その後:
catch (Group1 $e) {}
例外に関してOOPを使用することは非常に強力です。get_class
またはのようなものを使用することinstanceof
はハックであり、可能であれば回避する必要があります。
追加したい別のソリューションは、独自のメソッドに例外処理機能を配置することです。
あなたが持つことができます
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
あなたは例外クラス階層やインタフェースを制御することができます(とそこにほとんど常に手立て絶対にありませんと仮定します方法であること)は、次の操作を実行できます。
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);
}
このようにして、例外処理メカニズムを変更する必要がある場合でも、変更する必要があるコードの場所は1つだけであり、OOPの一般的な構造内で作業しています。