PHPの例外処理とロギング

大規模・長期的なPHP開発において、例外処理とログの管理は品質維持に欠かせません。
エラーの原因を把握し、適切に記録・通知することで、予期しないバグやセキュリティ問題への対処が可能になります。

本記事では、try / catchによる例外処理独自例外クラスの実装、そしてログ記録の基本とMonologライブラリの導入について実用コード付きで解説します。


try / catch構文とエラーハンドリング

PHPでは、例外(Exception)が発生した際に try / catch ブロックで処理を制御できます。

基本構文

<?php 
 try { 
  $divisor = 0; 
  if ($divisor === 0) { 
   throw new Exception("0で割ることはできません。"); 
  } 
  $result = 100 / $divisor; 
 } catch (Exception $e) { 
  echo "エラー発生: " . $e->getMessage(); 
 } 
?>
  • throw new Exception()で例外を発生
  • catchで例外を捕捉し、エラーメッセージを処理

例外の種類

PHPには以下の例外クラスが用意されています:

  • Exception:一般的な例外
  • PDOException:PDO接続やSQLエラー
  • TypeError / Error:型エラーや致命的エラー(PHP7以降)

独自例外クラスの作成

業務システムなどでは、アプリケーション独自の例外クラスを定義すると、エラーハンドリングの柔軟性が向上します。

例:UserNotFoundException

<?php 
 class UserNotFoundException extends Exception {} 
 function findUser($id) { 
  $users = [1 => "佐藤", 2 => "田中"]; 
  if (!isset($users[$id])) { 
   throw new UserNotFoundException("ID {$id} のユーザーが見つかりません。"); 
  } 
  return $users[$id]; 
 } 
 try { 
  echo findUser(3); 
 } catch (UserNotFoundException $e) { 
  echo "ユーザーエラー: " . $e->getMessage(); 
 } 
?>

ログ出力と監視(error_log、Monolog)

1. error_log()でエラーメッセージを記録

<?php 
 try { 
  throw new Exception("重大なエラーが発生しました。"); 
 } catch (Exception $e) { 
  error_log($e->getMessage(), 3, "logs/error.log"); 
  // logsフォルダに出力 
  echo "ログに記録しました。"; 
 } 
?>
  • 第2引数:ログの種類(3 = ファイル出力)
  • 第3引数:出力ファイルのパス

注意:書き込み先ディレクトリにパーミッションが必要です。


2. Monologライブラリの導入(Composer利用)

Monologは、PSR-3に準拠したログ管理ライブラリで、Laravelにも採用されています。

導入方法

composer require monolog/monolog

使用例

<?php 
 require 'vendor/autoload.php'; 
 use Monolog\Logger; 
 use Monolog\Handler\StreamHandler; 

 $log = new Logger('app'); 
 $log->pushHandler(new StreamHandler(__DIR__ . '/logs/app.log', Logger::WARNING)); 
 try { 
  throw new Exception("システム異常が発生しました。"); 
 } catch (Exception $e) { 
  $log->warning($e->getMessage()); 
  echo "Monologに記録しました。"; 
 } 
?>

Logger::WARNING などでログレベルを制御可能
ログ出力先をメール、Slack、DBなどにも拡張可能


まとめ

今回は、PHPの本格的なアプリ開発で不可欠な「例外処理とロギング」について解説しました。

  • try / catch構文でエラー制御とユーザーへの通知を分離
  • 独自例外でアプリのドメインエラーを明示
  • error_log()Monologでログを保存・分析

これらを活用すれば、信頼性の高い堅牢なPHPアプリケーションの基礎が固まります。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com