儘管這些其他答案說,你可以在同一個塊中捕獲AError
和BError
(如果你是定義例外的那個,它會更容易一些)。即使考慮到有些例外,你仍然應該能夠定義一個等級來滿足你的需求。
abstract class MyExceptions extends \Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
然後:
catch(LetterError $e){
//voodoo
}
正如你可以看到here和here,甚至SPL
默認的異常都有可以利用的層次結構。此外,作爲PHP Manual說:
當一個異常被拋出,代碼後面的語句將不被執行 和PHP將試圖找到第一個匹配的catch塊。
這意味着你也可以有
class CError extends LetterError {}
,你需要處理比AError
或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);
}
這樣,如果您的異常處理機制需要更改,並且您在OOP的一般結構中工作,那麼您仍然只有一個代碼位置需要修改。
只是爲了添加爲一個側面說明:RFC已被提交以捕獲多個異常。讓我們來看看這個特性是否能夠進入PHP語言...... https://wiki.php.net/rfc/multiple-catch – SimonSimCity
^這個特性已經在PHP 7.1中實現了 – Subin