【问题标题】:Get all the exceptions from one try catch block从一个 try catch 块中获取所有异常
【发布时间】:2013-08-13 12:05:49
【问题描述】:

我想知道是否可以抛出所有异常。

public function test()
    {
        $arrayExceptions = array();

        try {
            throw new Exception('Division by zero.');
            throw new Exception('This will never get throwed');
        }
        catch (Exception $e)
        {
            $arrayExceptions[] = $e;
        }

    }

我有一个巨大的 try catch 块,但我想知道所有的错误,而不仅仅是第一个抛出的错误。这可能需要不止一次尝试或类似的事情,或者我做错了吗?

谢谢

【问题讨论】:

  • 这不是异常的工作方式。如果它不是异常,你不应该使用异常——而是创建带有错误细节的对象,聚合它们,如果有必要,最后抛出一个异常。 (有些吹毛求疵:你总是会抛出所有异常 - 第一个会中断相关块的执行,其余的不会执行......)
  • throwing 异常的全部意义在于它在该点终止执行并基本上执行 GOTO 捕获块。因此,如果您可能有多个异常,则只会报告第一个异常。一旦进入 catch 块,继续执行 catch 块中的代码,如果你不杀死那里的程序,它会在 catch 块之后继续。

标签: php exception try-catch


【解决方案1】:

你自己写的:“这永远不会被扔掉” [原文如此]。

因为异常永远不会被抛出,所以你无法捕获它。只有一个异常,因为在抛出一个异常后,整个块被放弃,不再执行其中的代码。因此没有第二个例外。

【讨论】:

  • 看起来我对异常有一个错误的想法。我有一个初始化像 70 个字段的构造函数,我只想检索所有可能引发异常的错误。所以,我要把它改成不是抛出异常,而是保存错误消息,最后,如果有任何错误抛出异常。
【解决方案2】:

也许这就是 OP 实际要求的。如果函数不是原子的并且允许某种程度的容错,那么你可以知道之后发生的所有错误,而不是die()ing,如果你这样做:

public function test()
{
    $arrayExceptions = array();

    try {
        //action 1 throws an exception, as simulated below
        throw new Exception('Division by zero.');
    }
    catch (Exception $e)
    {
        //handle action 1 's error using a default or fallback value
        $arrayExceptions[] = $e;
    }

    try {
         //action 2 throws another exception, as simulated below
        throw new Exception('Value is not 42!');
    }
    catch (Exception $e)
    {
        //handle action 2 's error using a default or fallback value
        $arrayExceptions[] = $e;
    }

    echo 'Task ended. Errors: '; // all the occurred exceptions are in the array
    (count($arrayExceptions)!=0) ? print_r($arrayExceptions) : echo 'no error.';

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2019-11-11
    相关资源
    最近更新 更多