SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】部分的にtry catchを使いたい時

問題

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

php-logo

答え

<?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など);

関連するメモ

コメント