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();
}