2009-07-04 79 views
5

最近我一直在使用Exceptions。我认为记录未捕获的异常是有意义的,因为它极大地帮助开发人员通过查看异常日志来解决源代码中可能出现的问题。但是,如果处理异常,是否需要再次登录?是的,在一定程度上。如果您的代码中存在错误的“坏”开发人员,那么通过简单地捕获异常将会使这些错误“消失”。例如:记录捕获和未捕获的异常?

try 
{ 
fopen('/path/to/file','w'); 
} 
catch (Exception $e) 
{ 
// Display an error to user 
} 

上面的代码是PHP。关键是,这种代码imo不应该存在。例外情况意味着特殊情况并且很少发生,但是通过这些代码,它们发生得比较少。例如,开发者不检查文件是否存在,也不检查他是否有权写入。相反,它应该是:

try 
{ 
if (file_exists('/path/to/file') && is_writable('/path/to/file')) 
    fopen('/path/to/file','w'); 
else 
    // Display an error to user about file not existing or not being writable 
} 
catch (Exception $e) 
{ 
// Display an error to user about an unexpected error 
} 

这样做现在非常有意义。只有在例外情况下(例如服务器崩溃,停电等)才会抛出异常。但是如果开发人员对所有事情都使用Exceptions并且省略了检查 - 那么我是否有办法记录捕获到的异常?

我不希望开发人员将所有内容放在try-catch块中以“解决”问题。我希望他们明确地检查任何他们应该检查 - 离开例外像硬件故障,服务器崩溃等异常情况

回答

1

我不认为有一种神奇的方法类型的方法,如果这就是你要找的。但是否有可能将您的整个应用程序包装在try... catch...结构中?根据定义,任何例外达到最外层try... catch...都未被捕获......或者我错过了这一点;-)

+2

set_exception_handler(http://www.php.net/manual/en/function.set-exception-handler.php) – troelskn 2009-07-04 15:28:31

12

例外意味着是例外,很少发生,但与此代码,他们出现超过很少。

我认为这是一种误解。例外的地方是将理想流程与错误处理流程分开。

+0

例外例外 – 2013-08-08 07:59:36

0

我同意troelskn的评论,您应该只是将异常作为强化代码的有效方法。

如果你仍然想记录未捕获的异常,你必须让所有的开发人员将它们传递给日志记录功能(例如,log_exception($e)),或者将它们全部捕获到高级try/catch中并将它们记录在那里。您也可以使用像PHP_CodeSniffer这样的工具来检测与第一个示例类似的代码,但这不是一个好的解决方案。你需要编写自己的嗅探来检测这种情况;它可能会查找不包含任何if语句的try块。

6

您可以使用PHP的set_exception_handler函数,这会让您提供一个捕获所有未捕获的异常的函数,但是您必须为脚本中捕获的所有那些添加手动日志记录。