How can I reliably identify a specific error in PHP?

╄→гoц情女王★ 提交于 2019-12-19 10:12:13

问题


Because of PHP's unlink() not supporting exceptions natively, I'm making a wrapper function for it. It should throw a FileNotFoundException if, well, the given file could not be deleted because it doesn't exist.

For this, I need to determine whether the error thrown by unlink() was caused by a missing file or something else.

This is my test version for a custom delete function:

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

For $errLevel and $errString I get 2 (E_WARNING) and unlink(/tmp/fooNonExisting): No such file or directory

A rather bold approach would be like this:

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

Question 1: How much can I rely on the error string being the same across different PHP versions? Question 2: Is there a much better way?


回答1:


I would simplify the code:

public function deleteFile($path){

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

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

Then you don't have to catch the $errstr and do complicated error catching. And it will work down to PHP 4 when exceptions were introduced.




回答2:


While reading trough my old questions I came across the ErrorException, combined with set_error_handler() this would be a automatic Error to Exception transformer for all native PHP errors:

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'); 

Can anybody prof this?




回答3:


I believe it(i.e. your code) should be portable enough as it is... As regards a better way to achieve the same thing, i would do things differently (although the code is simple, it's also more readable...so bear with me)

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!");
    }
}

Of course you can always compress and improve on the code...hop this helps!




回答4:


I've seen php error messages change quite a bit over the years. Maybe, try to detect a change in the last error over a very granular piece of code, and then result to string parsing in a very loose manor.

$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...
}


来源:https://stackoverflow.com/questions/10899863/how-can-i-reliably-identify-a-specific-error-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!