例外処理は、プログラム実行中に発生するエラー(例外)をキャッチして適切に処理する仕組みです。try-catch文を使うことで、エラーが発生してもプログラムを安全に続行できます。
基本的な使い方
構文
try {
// 例外が発生する可能性のある処理
} catch (Exception $e) {
// 例外が発生した場合の処理
} finally {
// 例外の有無に関わらず必ず実行される処理
}
PHP
<?php
function divide(int $a, int $b): float {
if ($b === 0) {
throw new Exception("0で割ることはできません");
}
return $a / $b;
}
try {
echo divide(10, 2) . "<br>"; // 5
echo divide(10, 0) . "<br>"; // 例外が発生
echo "この行は実行されない<br>";
} catch (Exception $e) {
echo "エラー: " . $e->getMessage() . "<br>";
} finally {
echo "処理完了<br>";
}
?>
実行結果
5
エラー: 0で割ることはできません
処理完了
複数の例外をキャッチ
PHP
<?php
try {
$file = fopen("nonexistent.txt", "r");
if ($file === false) {
throw new RuntimeException("ファイルが開けません");
}
} catch (InvalidArgumentException $e) {
echo "引数エラー: " . $e->getMessage();
} catch (RuntimeException $e) {
echo "実行時エラー: " . $e->getMessage();
} catch (Exception $e) {
echo "その他のエラー: " . $e->getMessage();
}
?>
具体的な例外クラスから順にキャッチします。Exceptionは全ての例外の親クラスなので、最後に配置します。
カスタム例外クラス
PHP
<?php
class ValidationException extends RuntimeException {
private array $errors;
public function __construct(array $errors) {
$this->errors = $errors;
parent::__construct("バリデーションエラー");
}
public function getErrors(): array {
return $this->errors;
}
}
try {
$age = -5;
if ($age < 0) {
throw new ValidationException(["age" => "年齢は0以上にしてください"]);
}
} catch (ValidationException $e) {
foreach ($e->getErrors() as $field => $message) {
echo "{$field}: {$message}<br>";
}
}
?>
例外を使うべき場面
例外は「異常事態」に使います。ファイルが見つからない、DBに接続できない、APIがエラーを返したなど、プログラムが正常に処理を続行できない場合にthrowします。
例外を握りつぶさない
catchブロックで何もせず例外を無視する(握りつぶす)と、バグの原因が隠蔽されます。最低限ログに記録するか、適切なエラーメッセージを表示しましょう。
まとめ
try-catchで例外をキャッチし、エラーを安全に処理できるthrowで例外を発生させ、finallyで後処理を行う- 複数のcatchブロックで例外の種類ごとに処理を分けられる
- カスタム例外クラスでドメイン固有のエラーを表現できる