我最近一直在与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块中以“解决”问题。我希望他们明确检查他们应该检查的内容 - 并为硬件故障,服务器崩溃等异常情况留下例外。
答案 0 :(得分:12)
异常是特殊的,很少发生,但是使用这些代码它们的发生次数很少。
我认为这是一种误解。例外的一点是将理想流与错误处理流分开。
答案 1 :(得分:6)
您可以使用PHP的set_exception_handler函数,这将允许您提供一个函数来捕获所有未捕获的异常,但您必须为脚本中捕获的所有异常添加手动日志记录。
答案 2 :(得分:1)
我不认为这是一种神奇的方法类型方法,如果这是你正在寻找的。但是可以将整个应用程序包装在try... catch...
结构中吗?根据定义,任何到达最外层try... catch...
的例外都没有被捕获......或者我错过了这一点; - )
答案 3 :(得分:0)
我同意troelskn的意见,你应该将异常作为强化代码的有效方式。
如果您仍想记录未捕获的异常,则必须让所有开发人员将它们传递给日志记录函数(例如log_exception($e)
)或者在高级try / catch中捕获所有这些异常。记录它们。您也可以使用PHP_CodeSniffer之类的工具来检测与第一个示例类似的代码,但这不是一个很好的解决方案。你需要编写自己的嗅探来检测这种情况;它可以查找不包含任何try
语句的if
块。