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

时间:2012-06-05 15:07:04

标签: php exception-handling

由于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_WARNING)和取消关联(/ tmp / fooNonExisting):没有这样的文件或目录 < / p>

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

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

问题1:在不同的PHP版本中,我可以依赖多少错误字符串?问题2:有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

我会简化代码:

public function deleteFile($path){

    if (!file_exists($path) {
        throw new FileNotFoundException();
    }else{
        unlink($path);
    }

    if (file_exists($path) {
        throw new FileNotDeleted();
    }
}

然后你不必抓住$errstr并执行复杂的错误捕获。当引入异常时,它将工作到PHP 4。

答案 1 :(得分:1)

在阅读旧questions时,我遇到了ErrorException,结合set_error_handler()这将是一个自动 错误到异常转换器 < / strong>对于所有本机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'); 

有人可以教这个吗?

答案 2 :(得分:0)

我相信它(即你的代码)应该足够便携,因为它...... 至于实现同样的事情的更好的方法,我会做不同的事情(虽然代码很简单,它也更具可读性......所以忍受我)

function deleteFile($file_path){
    if(!is_file($file_path)){
        throw new Exception("The path does not seem to point to a valid file");
    }
    if(!file_exists($file_path)){
        throw new Exception("File not found!");
    }
    if(unlink($file_path)){
        return true;
    } else {
        throw new Exception("File deletion failed!");
    }
}

当然,你可以随时压缩和改进代码......跳这有帮助!

答案 3 :(得分:0)

多年来,我看到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...
}