记录已捕获和未捕获的异常?

5

最近我一直在处理异常。我认为记录未捕获的异常是有意义的,因为它可以帮助开发人员通过查看异常日志来解决源代码中可能存在的问题。但是,当一个异常被处理后,还需要继续记录吗?在某种程度上是需要的。如果你有“糟糕”的开发人员编写有缺陷的代码,那么仅仅捕获异常将使这些缺陷消失。例如:

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

上述代码是PHP。我的看法是,这种代码不应该存在。异常情况应该是罕见的,但是在这个代码中它们出现得更加频繁。例如,开发人员没有检查文件是否存在,也没有检查是否有写入权限。相反,代码应该是这样的:

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
}

这现在基本上很有道理。只有在出现异常情况(例如服务器崩溃、停电等)时才会抛出和捕获异常。但是,如果开发人员将所有内容都使用异常并省略检查,那么我是否有办法记录捕获的异常?
我不希望开发人员将所有内容放入try-catch块中以“解决”问题。我希望他们明确检查应该检查的任何内容,并将异常留给像硬件故障、服务器崩溃等异常情况。
4个回答

12

异常应该是罕见的情况,但是使用这段代码后就变得不再罕见了。

我认为这是一个误解。异常的目的在于将理想的流程与错误处理的流程分离。


异常的例外情况 - Matthew Lock

6
你可以使用PHP的set_exception_handler函数,这将允许你提供一个函数来捕获所有未被捕获的异常,但是你需要在你的脚本中手动记录所有已经被捕获的异常。

这里有一个关于日志异常处理程序的不错介绍:https://dev59.com/x6nka4cB1Zd3GeqPN27X#49046952 - Brian Wood

1

如果你在寻找一种魔法方法类型的方法,我认为并不存在这样的方法。但是,你是否可以将整个应用程序包装在一个 try... catch... 结构中呢?根据定义,任何到达最外层的 try... catch... 的异常都是未捕获的...或者我理解错了吗 ;-)


2
set_exception_handler (http://www.php.net/manual/zh/function.set-exception-handler.php) - troelskn

0

我同意troelskn的评论,你应该将异常视为一种有效的加固代码的方式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接