【php】部分的にtry catchを使いたい時
問題
プログラム全体で、すでにエラーハンドラが設定されていて、エラー時例外が飛ばないように書かれている中で、部分的に try catch を使いたい。

答え
<?php
// エラーハンドラで一時的にエラーを例外に変換
set_error_handler(function($errno, $message, $file, $line) {
if(!($errno & error_reporting())) return true;
throw new ErrorException($message, 0, $errno, $file, $line);
});
// ここでは例外が飛ぶ
try { ... }
catch (Exception $ex) { ... }
// エラーハンドラの内容をひとつ前(元)に戻す
restore_error_handler();
・PDOの場合
<?php
// エラーハンドラで一時的にエラーを例外に変換
set_error_handler(function($errno, $message, $file, $line) {
if(!($errno & error_reporting())) return true;
throw new ErrorException($message, 0, $errno, $file, $line);
});
// ↓ PDOでのDBエラーも例外で飛ばす
$pdo = new PDO("~~~");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try { ... }
catch (Exception $ex) { ... }
// エラーハンドラの内容をひとつ前(元)に戻す
restore_error_handler();
// PDOのエラーモードも戻す(*)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENTなど);