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

関連項目

php エラーを例外に飛ばしたい(try-catch、set_error_handler)