由于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:有更好的方法吗?
答案 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...
}