更新:
从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
在同一个块(这是比较容易,如果你是一个定义例外)。即使存在您要“掉线”的例外情况,您仍然应该能够定义层次结构来满足您的需求。
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
或的方式进行处理BError
,因此catch语句应如下所示:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
如果您有二十个或更多合法属于同一超类的异常,并且您需要以一种方式处理五个(或任何大型集团),其余以另一种方式处理,那么您仍然可以这样做。
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的常规构造中工作,则您仅需修改一个代码位置。