2009-05-29 50 views
15

PHPのmkdir関数はtrueとfalseを返します。問題はfalseを返すときです。mkdirがPHPから失敗する理由を見つけるには?

エラー報告を有効にして実行している場合、画面にエラーメッセージが表示されます。また、Apacheログにエラーメッセージが表示されます。しかし、私はメッセージのテキストをつかんで、別のことをしたいと思います(例えば、IM経由で自分自身に送る)。エラーテキストを取得するにはどうすればよいですか?

更新:アイマンのアイデア後、私はこれに来た:

function error_handler($errno, $errstr) { 
    global $last_error; 
    $last_error = $errstr; 
} 

set_error_handler('error_handler'); 
if (!mkdir('/somedir')) 
    echo "MKDIR failed, reason: $last_error\n"; 
restore_error_handler(); 

それはグローバル変数を使用しているのでしかし、私はそれを好きではありません。よりクリーンなソリューションのアイデア? error_get_last()

+0

Soulmergeの答えは、より良い選択でありますこれは、ハンドラを置き換えずにエラーを通知するためです。 –

+4

エラーハンドラはPHPのスタックに格納されています。つまり、restore_error_handler()を呼び出すと、組み込みハンドラでも別のカスタムハンドラでも、以前のエラーハンドラが復元されます。したがって、エラーハンドラをset_error_handler()で一時的に置き換えることに損失はありません。 – soulmerge

答えて

42

あなたがsuppress the warningとすることができます使用:

if ([email protected]($dir)) { 
    $error = error_get_last(); 
    echo $error['message']; 
} 
+5

+1ですが、mkdir()とerror_get_last()の間に別のエラーが発生した場合、このコードは脆弱である可能性があります。 error_get_last()呼び出しの前にエラーを生成します)。どんな種類の最終エラー機能を使用していても、これは常にリスクです。 –

14

はあなたが使用することができ例外:いくつかのコードそれほどのような

セットアップ:その後、

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

とはちょうど行います

try { 
    mkdir('/somedir'); 
} catch(ErrorException $ex) { 
    echo "Error: " . $ex->getMessage(); 
} 

それはあなたがしたいことを行う必要があります。

あなたがPHPのエラーハンドラを保持したい場合は、その後にcatchブロックを試してみてください、ちょうど呼び出し:

restore_error_handler() 
+0

+1 私はこのアプローチが好きですが、私はそれをテストしていませんが、それはしっかりしています。また、より親和的に見えます;) –

+2

また、PHPのオブジェクト指向ライブラリは、このすべてのものをもっとうまく処理します。http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdirは例外をスローしません、それが例外をスローするカスタムエラーハンドラの理由です。 PHPのOOライブラリに関しては、そうかもしれません。 – Kazar

3

私は、次のようなものを使用します。

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
} 
関連する問題