我想一个更清洁的方式来获得以下功能,以捕捉AError
和BError
在一个块:
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
有什么办法吗?还是我必须分开抓住它们?
AError
并Berror
具有一个共享的基类,但它们也与其他我要介绍的类型共享它handler2
,因此我不能只抓住基类。
从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
尽管这些什么其他的答案说,你可以赶上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的常规构造中工作,则您仅需修改一个代码位置。
本文向大家介绍是否可以在单个catch块中捕获多个Java异常?,包括了是否可以在单个catch块中捕获多个Java异常?的使用技巧和注意事项,需要的朋友参考一下 例外是程序执行期间发生的问题(运行时错误)。发生异常时,程序会突然终止,并且生成异常的行之后的代码将永远不会执行。 代码中有多个异常 在Java 7之前,只要我们有一个可能会生成多个异常的代码,并且如果您需要专门处理该代码,则应在一次尝
问题内容: 我知道我可以做到: 我也可以这样做: 但是,如果我想在两个不同的异常中做同样的事情,那么我现在想到的最好的方法就是: 有什么办法可以做这样的事情(因为在两个异常中都采取的措施是): 现在,这确实不起作用,因为它与以下语法匹配: 因此,我捕捉两个截然不同的异常的努力并未完全实现。 有没有办法做到这一点? 问题答案: 例如,子句可以将多个异常命名为带括号的元组。 或者,仅对于Python
问题内容: 我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做类似的事情: 是否可以避免在每个catch块中重复处理程序代码? 问题答案: Java 7及更高版本 从Java 7开始,支持多异常捕获。 语法为: 的静态类型是列出的异常中最特殊的通用超类型。有一个很好的功能,如果您将其重新抛出,编译器就会知道只能抛出列出的异常之一。 Java 6及更早版本 在Java 7之前,有多种方法可以解决
请求(正文)
问题内容: 在Java中,我想做这样的事情: …代替: 有什么办法吗? 问题答案: 从Java 7开始,这已经成为可能。多捕获块的语法为: 但是请记住,如果所有异常都属于同一类层次结构,则可以简单地捕获该基本异常类型。 还要注意,如果从ExceptionA直接或间接继承了ExceptionB,则不能在同一块中同时捕获ExceptionA和ExceptionB。编译器会抱怨:
在尝试我在方法中发现的多捕获特性时,一切都按预期正常工作。