当前位置: 首页 > 面试题库 >

在一个catch块中捕获多种异常类型

安聪
2023-03-14
问题内容

我想一个更清洁的方式来获得以下功能,以捕捉AErrorBError在一个块:

try
{
    /* something */
}
catch( AError, BError $e )
{
    handler1( $e )
}
catch( Exception $e )
{
    handler2( $e )
}

有什么办法吗?还是我必须分开抓住它们?

AErrorBerror具有一个共享的基类,但它们也与其他我要介绍的类型共享它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

对于7.1之前的PHP:

尽管这些什么其他的答案说,你可以赶上AErrorBError在同一个块(这是比较容易,如果你是一个定义例外)。即使存在您要“掉线”的例外,您仍然应该能够定义层次结构来满足您的需求。

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。编译器会抱怨:

  • 在尝试我在方法中发现的多捕获特性时,一切都按预期正常工作。