【问题标题】:Store PHP Exceptions in array将 PHP 异常存储在数组中
【发布时间】:2010-04-30 12:04:53
【问题描述】:

我真的不确定这是否是正确的方法,因为异常对我来说确实是一个新鲜的主题。是否可以捕获多个异常(让脚本继续执行),然后将异常存储在数组中以便能够返回所有引起的异常?

话虽如此,能够使用异常来不仅仅是显示杀死应用程序(脚本)的错误会很棒

谢谢!

【问题讨论】:

    标签: php error-handling exception


    【解决方案1】:

    起初,异常处理并不像看起来那么简单,因此您应该在这方面投入一点时间。 :-)

    您应该将异常显式视为您无法在当前代码/函数中处理的错误。如果可以解决问题,则无需抛出和处理异常。
    不要将其用作处理预期行为的机制。

    当然可以捕获多个异常,继续执行代码并将它们存储在一个数组中,但这没有任何意义。如果您确实遇到当前代码中无法处理的错误(例如突然关闭的套接字等),您可以通过代码中的异常。那么规则是:
    只有当你可以用它做一些有用的事情或抛出另一个异常时才捕获一个异常

    为了跟踪应用程序中的错误,您应该使用其他技术,而不是将它们存储在数组中并稍后检索它们。使用 Logging(有很好的框架,例如 Log4PHP)来记录小的应用程序错误和警告。

    话虽如此,那真是太棒了 能够使用超过 只是显示一个杀死 应用程序(脚本)

    只有在您无能为力的情况下,异常才会终止应用程序。同样在大多数情况下,最好在脚本的最高级别捕获所有异常,使用堆栈跟踪记录错误并向用户显示一个很好的错误消息,而不是仅仅“杀死”所有内容。 :-)

    有关一些语法示例,请参阅W3Schools PHP Exception Handling。 有关此主题的更大文章发布在Devshed

    【讨论】:

    • 嗨,Echox!感谢您的出色而广泛的回复。您有任何关于如何将 Log4PHP 用于数组的示例吗?谢谢!
    • 为什么要将所有内容存储在数组中? :-) 只需将其记录到您的文件系统或数据库表中?但是如果你真的需要将你的“日志”存储到一个数组中,只需使用 $e->getMessage();并将结果字符串存储在数组中。请参阅 W3Schools 示例中的多个异常和重新抛出异常。
    • 您好!我正在尝试收集从链接操作创建的许多错误/状态消息,以连同函数的结果(真/假)一起发送回用户
    • 话虽如此,通过数据库收集有关数据库连接丢失的错误感觉并不好:)
    • @Industrial,你现在问的和你一开始问的完全不同。存储异常与存储错误消息非常不同。
    【解决方案2】:

    这并不是真正的例外。在许多语言中,异常只是您可以捕获并简单地放入数组中以供以后检查的对象,但这很可能是一个糟糕的设计。

    机制的名称表明发生了一些“异常”,您需要立即处理。

    【讨论】:

      【解决方案3】:

      你可以用它们做更多的事情,而不仅仅是杀死脚本 - 但 San Jacinto 说得对,将它们存储在数组中以供以后处理并不是特别好的做法。

      也许您应该阅读一下(包括示例,它们会很有用):

      http://php.net/manual/en/language.exceptions.php

      这应该向您展示一些其他使用异常的方法,而不仅仅是停止执行。

      祝你好运!

      【讨论】:

        【解决方案4】:

        Larry Wall 在他的上一篇洋葱状态文章中写到了这一点。每个人都希望能够拥有一个错误抛出/捕获框架。事实是,仅仅依靠框架来处理检查不佳的代码是一种糟糕的编码习惯。另外,它使调试变得非常困难。

        我的建议是,而不是这样:

        try {
            $fh = fopen("foo.txt", 'r');
            if (!$fh) {
               throw new Exception("foo.txt not found");
            }
            # ...
        } catch (Exception $e) {
            # report errors
        }
        

        当它们发生时将它们收集到消息缓冲区中:

        @errors = array();
        if (! (is_file("foo.txt") && $fh = fopen("foo.txt", 'r')) ) {
            $errors []= "foo.txt not found";
        }
        # ...
        

        这样,您的堆栈指针就不会到处乱跳,试图找到Exception 的处理程序。

        PHP 试图太像 Java,恕我直言。

        【讨论】:

        • 任何中等复杂的应用程序都会使用这种方法变得指数级复杂,除非您指的是确实不是那么糟糕并且实际上应该是警告的异常。缓存(不是“捕获”,而是“缓存”))它们很容易;以后再和他们打交道是非常困难的。部分问题是您丢失了异常发生时的大部分状态。另一个问题是何时处理这些异常的问题。我个人认为你的方法打开了一罐蠕虫。
        猜你喜欢
        • 1970-01-01
        • 2016-10-09
        • 2022-10-17
        • 2012-02-12
        • 1970-01-01
        • 2010-11-07
        • 2013-09-04
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多