php 一時的にwarnigを拾いたい(set_error_handler()、restore_error_handler())
file_put_contents()を実行したときのwarnigを例外に飛ばしたい。でもfile_get_contents()では例外に飛ばしたくない。
作成日:2021-11-24, 更新日:2021-11-24
基本
ひとまず公式のソースをコールバックに設定
※warnigとか関係なしに基本的な記述。
function callback_exception_error_handler($severity, $message, $filename, $lineno) { if (!(error_reporting() & $errno)) { // error_reporting 設定に含まれていないエラーコードのため、 // 標準の PHP エラーハンドラに渡されます。 return; } $errstr = htmlspecialchars($errstr); // $errstr はエスケープする必要があるかもしれません。 switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; // PHP の内部エラーハンドラを実行しません } try { ~ なにかの処理 ~ // waringがあっても何もしない set_error_handler('callback_exception_error_handler'); // 第2引数省略で「E_ALL」になる ~ なにかの処理 ~ // waringがあったら例外へ } catch (Exception $e) { echo $e->getMessage(); } restore_error_handler(); // set_error_handler()の設定解除
例外に飛んでくれないwaringを例外に飛ばしたい
大人の事情で全体の設定を変更することができない・・・しょうがないから一時的にどうにかしたい
・「set_error_handler()」を使って設定
・「restore_error_handler()」で設定した「set_error_handler()」の解除
function callback_exception_error_handler($severity, $message, $filename, $lineno) { throw new ErrorException($message, 0, $severity, $filename, $lineno); } try { ~ なにかの処理 ~ // waringがあっても何もしてくれない set_error_handler('callback_exception_error_handler', E_WARNING); // waringのみ設定 ~ なにかの処理 ~ // waringがあったら例外へ飛んでくれる } catch (Exception $e) { echo $e->getMessage(); } restore_error_handler(); // set_error_handler()の設定解除
file_put_contents()とfile_get_contents()のwarnig
ココが今回の問題というかやりたかった感じのソース
- 「file_put_contents()」のwaringだけ例外に飛ばしたい
- 「file_get_contents()」の404の処理はしたくない
※contextだったりレスポンスのhttpコードで何かをするのは面倒・・・
function callback_exception_error_handler($severity, $message, $filename, $lineno) { throw new ErrorException($message, 0, $severity, $filename, $lineno); } $files = array( 'http://〇〇〇/hoge.jpg', 'http://〇〇〇/foo.jpg', ); foreach ( $files as $row_file ) { $source = @file_get_contents($row_file); if ( !$source ) { continue; } try { set_error_handler('callback_exception_error_handler', E_WARNING); // waringのみ設定 file_put_contents(〇〇〇, $source); } catch (Exception $e) { echo $e->getMessage(); } restore_error_handler(); }