如何可靠地识别PHP中的特定错误?

如何可靠地识别PHP中的特定错误?,php,exception-handling,Php,Exception Handling,由于PHP的unlink()本机不支持异常,所以我为它制作了一个包装函数。如果给定的文件由于不存在而无法删除,它应该抛出一个FileNotFoundException 为此,我需要确定unlink()引发的错误是由丢失的文件还是其他原因引起的 这是自定义删除函数的测试版本: public function deleteFile($path){ set_error_handler(function($errLevel, $errString){ debug($errLeve

由于PHP的
unlink()
本机不支持异常,所以我为它制作了一个包装函数。如果给定的文件由于不存在而无法删除,它应该抛出一个
FileNotFoundException

为此,我需要确定
unlink()
引发的错误是由丢失的文件还是其他原因引起的

这是自定义删除函数的测试版本:

public function deleteFile($path){
    set_error_handler(function($errLevel, $errString){
        debug($errLevel);
        debug($errString);
    });
    unlink($path);
    restore_error_handler();
}
对于
$errLevel
$errString
我得到2(E_警告)和取消链接(/tmp/fooonoexisting):没有这样的文件或目录

一个相当大胆的方法是这样的:

if( strpos($errString, 'No such file or directory') !== false ) {
    throw new FileNotFoundException();
};

问题1:我能在多大程度上依赖不同PHP版本中相同的错误字符串?问题2:有更好的方法吗?

我会简化代码:

public函数deleteFile($path){
如果(!file_存在($path){
抛出新的FileNotFoundException();
}否则{
取消链接($path);
}
如果(文件_存在($path){
抛出新文件notdeleted();
}
}
这样,您就不必捕获
$errstr
并执行复杂的错误捕获。当引入异常时,它将工作到PHP4。

我相信它(即您的代码)应该具有足够的可移植性,因为它是。。。 至于更好的方法来实现同样的事情,我会做不同的事情(虽然代码很简单,但可读性也更高…所以请容忍我)


当然,您可以随时压缩和改进代码…跳过这一步很有帮助!

我看到php错误消息在过去几年中发生了很大的变化。也许,可以尝试在一段非常精细的代码中检测上一个错误的变化,然后在一个非常松散的区域中进行字符串解析

$lastErr = error_get_last();
unlink($file);
if ($lastErr !== error_get_last()) {
    // do something
    //maybe string parsing and/or testing with file_exists, is_writable etc...
}

在阅读旧版本时,我遇到了,与
set\u error\u handler()
相结合,对于所有本机PHP错误,这将是一个自动的异常转换器错误:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
unlink('Does not exitsts'); 

有人能证明这一点吗?

是的,很好的解决方案。但这也会掩盖所有其他类型的问题,例如错误的文件权限。我只希望将“未找到文件”转换为异常。我修改了您的解决方案(审阅待定),使用
unlink()
else
块中,我们可以去掉坏的
@
部分。我可能会使用此技术,但让我们等待关于初始错误处理/识别问题的其他答案。选择此答案作为正确答案,尽管它不会教我很多关于PHP错误处理程序的细节。但它指向simple direction,这也是我要求的。对于PHP错误“magic”,请看一看,它不会对每个错误都有效。除了解析器时间和启动错误之外,其他一些运行时错误,如致命错误,不会被任何错误处理程序捕获。
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
unlink('Does not exitsts');