2010-04-30 56 views
3

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

通过这么说,这将是真棒,以便能够使用异常多只表明杀死应用程序(脚本)

由于一个错误!

回答

11

起初,异常处理不是微不足道,因为它的样子,所以你应该在这个投资一点时间。 :-)

您应该将异常显式看作是在当前代码/函数中无法处理的错误。如果你能解决问题,就没有必要抛出和处理异常。
不要将其用作处理预期行为的机制。

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

对于跟踪误差在你的应用程序,你应该使用其他技术不是将它们存储在一个数组,后来检索它们。使用日志记录(有很好的框架,例如Log4PHP)记录次要应用程序错误和警告。

通过这么说,这将是真棒,以 能够使用异常超过 只是表明杀死 应用程序(脚本)

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

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

+0

嗨Echox!感谢您的广泛答复。你有任何关于如何使用Log4PHP到数组的例子吗? 谢谢! – Industrial 2010-04-30 13:49:03

+0

为什么要将所有内容存储在数组中? :-)只需将其记录到您的文件系统或数据库表中? 但是,如果你真的需要将你的“日志”存储到数组中,只需使用$ e-> getMessage();并将结果字符串存储在一个数组中。请参阅W3Schools示例中的多个异常和反思异常。 – echox 2010-04-30 14:46:22

+0

再次嗨!我试图收集从链式操作创建的一些错误/状态消息,并将结果与​​功能一起发回给用户(true/false) – Industrial 2010-04-30 14:58:26

6

这不是真正的例外。在很多语言中,异常只是您可以捕获的对象,并且只是插入一个数组中供以后检查,但它确实是一个糟糕的设计。

该机制的名称表明发生了某种“例外”,您需要立即进行处理。

2

可不仅仅是查杀脚本与他们做更多的 - 但是圣哈辛托是正确的说,它不会将它们存储在一个数组后处理特别好做法。

也许你应该有这样一个读(包括例子,他们会很有用):

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

这应该告诉你,你可以使用异常其他一些方法,而不只是停止执行。

祝你好运!

1

拉里沃尔在他最后一篇关于洋葱篇的文章中写到这件事。每个人都希望能够有一个错误投掷/捕捉框架。事实是,仅仅依靠框架来处理一个经过严格检查的代码就变成了糟糕的编码习惯。另外,它使调试非常困难。

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

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"; 
} 
# ... 

这样一来,你的堆栈指针ISN”跳到各地试图找到一个处理程序的Exception

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

+4

任何适度复杂的应用程序都会与此方法呈指数级复杂关系,当然除非您指的是那些实际上并不那么糟糕并且实际上应该是警告的异常。缓存(不是“捕捉”,而是“缓存”))它们很容易;它后来处理它们非常困难。问题的一部分是,当发生异常时,你失去了很多状态。另一个问题是何时处理这些例外的问题。我个人认为你的方法会打开一堆蠕虫。 – 2010-04-30 12:55:56