我想用一种更干净的方式来获得以下功能,在一个块中捕获AError和BError:
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
有什么办法可以做到吗?还是我得分别抓他们?
AError和Berror有一个共享的基类,但它们还与我希望落入handler2的其他类型共享这个基类,因此不能只捕获基类。
一个很好的方法是使用set_exception_handler。
警告! !在PHP 7中,如果出现致命错误,可能会出现死机白屏。例如,如果你在一个非对象上调用一个方法,你通常会得到致命错误:在null上调用成员函数your_method(),如果错误报告是打开的,你会期望看到这个。
上面的错误不会被catch捕获(异常$e)。
上述错误不会触发set_error_handler设置的任何自定义错误处理程序。
你必须使用catch(Error $e){}来捕获PHP7中的错误。
这可能会有所帮助:
class ErrorHandler{
public static function excep_handler($e)
{
print_r($e);
}
}
set_exception_handler(array('ErrorHandler','excep_handler'));
在PHP >= 7.1中,这是可能的。请看这个答案。
如果可以修改异常,请使用此答案。
如果不能,可以尝试用Exception捕获所有异常,然后用instanceof检查抛出了哪个异常。
try
{
/* something */
}
catch( Exception $e )
{
if ($e instanceof AError OR $e instanceof BError) {
// It's either an A or B exception.
} else {
// Keep throwing it.
throw $e;
}
}
但是,如前面提到的答案所述,使用多个捕获块可能会更好。
try
{
/* something */
}
catch( AError $e )
{
handler1( $e );
}
catch ( BError $b )
{
handler2( $e );
}
一个很好的方法是使用set_exception_handler。
警告! !在PHP 7中,如果出现致命错误,可能会出现死机白屏。例如,如果你在一个非对象上调用一个方法,你通常会得到致命错误:在null上调用成员函数your_method(),如果错误报告是打开的,你会期望看到这个。
上面的错误不会被catch捕获(异常$e)。
上述错误不会触发set_error_handler设置的任何自定义错误处理程序。
你必须使用catch(Error $e){}来捕获PHP7中的错误。
这可能会有所帮助:
class ErrorHandler{
public static function excep_handler($e)
{
print_r($e);
}
}
set_exception_handler(array('ErrorHandler','excep_handler'));
本文讨论的问题是electrictoolbox.com/php-catch-multiple-exception-types。文章内容直接复制:
例异常
以下是为本例的目的而定义的一些示例异常:
class FooException extends Exception
{
public function __construct($message = null, $code = 0)
{
// do something
}
}
class BarException extends Exception
{
public function __construct($message = null, $code = 0)
{
// do something
}
}
class BazException extends Exception
{
public function __construct($message = null, $code = 0)
{
// do something
}
}
处理多个异常
这很简单——对于每个可以抛出的异常类型都可以有一个catch块:
try
{
// some code that might trigger a Foo/Bar/Baz/Exception
}
catch(FooException $e)
{
// we caught a foo exception
}
catch(BarException $e)
{
// we caught a bar exception
}
catch(BazException $e)
{
// we caught a baz exception
}
catch(Exception $e)
{
// we caught a normal exception
// or an exception that wasn't handled by any of the above
}
如果抛出了一个没有被任何其他catch语句处理的异常,它将被catch(exception $e)块处理。它不一定是最后一个。