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て複雑なエラーキャッチを行う必要はありません。また、例外が導入された場合はPHP4まで機能します。

于 2012-06-05T15:18:29.113 に答える
1

古い質問を読んでいるときに、これとErrorException組み合わせると、すべてのネイティブ PHP エラーset_error_handler()の自動Error to Exception トランスフォーマーになります。

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

私は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 に答える
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 に答える