2

由于 PHPunlink()本身不支持异常,我正在为它制作一个包装函数。它应该抛出一个FileNotFoundException如果给定的文件不能被删除,因为它不存在。

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

这是我的自定义删除功能的测试版本:

public function deleteFile($path){
    set_error_handler(function($errLevel, $errString){
        debug($errLevel);
        debug($errString);
    });
    unlink($path);
    restore_error_handler();
}

For $errLeveland $errStringI get 2 (E_WARNING) and unlink(/tmp/fooNonExisting): No such file or directory

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

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

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

4

4 回答 4

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。

于 2012-06-05T15:18:29.113 回答
1

在阅读我遇到的旧问题ErrorException时,结合set_error_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'); 

任何人都可以教授这个吗?

于 2012-06-06T18:27:02.950 回答
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!");
    }
}

当然,您始终可以压缩和改进代码……这有帮助!

于 2012-06-05T15:27:47.683 回答
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...
}
于 2012-06-05T15:37:36.267 回答