大規模・長期的な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アプリケーションの基礎が固まります。