Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. try / catch / finally / throw

try / catch / finally / throw対応: PHP 5(2004)

例外処理は、プログラムの実行中に発生したエラーを捕捉して適切に対処するための仕組みです。データベース操作やファイル操作など、実行時にエラーが起こりうる処理で使用されます。

構文
// 例外を捕捉する基本構文です。
try {
	// 例外が発生する可能性のある処理
} catch (Exception $e) {
	// 例外が発生した場合の処理
} finally {
	// 例外の有無にかかわらず必ず実行される処理
}

// 例外をスローします。
throw new Exception($message, $code);
構文一覧
構文概要
try例外が発生する可能性のあるコードを囲むブロックです。
catch (ExceptionType $e)指定した型の例外を捕捉します。複数の『catch』を連結して異なる例外を個別に処理できます。
finally例外の発生有無にかかわらず必ず実行されるブロックです。PHP 5.5以降で使用できます。
throw例外オブジェクトをスローします。処理が中断され、最も近い『catch』ブロックに制御が移ります。
主な例外クラス
クラス概要
Exceptionすべての例外の基底クラスです。
RuntimeException実行時に発生する例外を表します。
InvalidArgumentException不正な引数が渡された場合の例外です。
PDOExceptionデータベース操作のエラーで発生する例外です。
TypeError型の不一致が発生した場合の例外です。PHP 7以降で使用できます。
ValueError型は正しいが値が不正な場合の例外です。PHP 8以降で使用できます。
JsonExceptionJSONの変換エラーで発生する例外です。PHP 7.3以降で使用できます。
サンプルコード
<?php
// 基本的な例外処理です。
try {
	$result = 10 / 0; // ゼロ除算が発生します。
} catch (DivisionByZeroError $e) {
	echo "エラー: " . $e->getMessage(); // 『Division by zero』と出力されます。
}

// 例外をスローして捕捉します。
function validateAge(int $age): void
{
	if ($age < 0 || $age > 150) {
		throw new InvalidArgumentException("年齢は0〜150の範囲で指定してください。");
	}
}

try {
	validateAge(200);
} catch (InvalidArgumentException $e) {
	echo $e->getMessage(); // 『年齢は0〜150の範囲で指定してください。』と出力されます。
}

// 複数の例外型を個別に処理します。
try {
	$pdo = new PDO('mysql:host=localhost;dbname=myapp', 'user', 'password');
	$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
	$stmt->execute([':id' => 'abc']); // 不正な値
} catch (PDOException $e) {
	echo "データベースエラー: " . $e->getMessage();
} catch (Exception $e) {
	echo "予期しないエラー: " . $e->getMessage();
}

// PHP 8以降ではキャッチする型をパイプで複数指定できます。
try {
	$data = json_decode('invalid', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException | InvalidArgumentException $e) {
	echo "入力データのエラー: " . $e->getMessage();
}

// finally ブロックは必ず実行されます。
$file = null;
try {
	$file = fopen('data.txt', 'r');
	if ($file === false) {
		throw new RuntimeException("ファイルを開けません。");
	}
	$content = fread($file, filesize('data.txt'));
	echo $content;
} catch (RuntimeException $e) {
	echo "エラー: " . $e->getMessage();
} finally {
	if ($file !== null) {
		fclose($file); // 例外が発生しても確実にファイルを閉じます。
	}
}

// Exception の主なメソッドです。
try {
	throw new Exception("テストエラー", 500);
} catch (Exception $e) {
	echo $e->getMessage(); // 『テストエラー』と出力されます。
	echo $e->getCode(); // 『500』と出力されます。
	echo $e->getFile(); // 例外が発生したファイル名が出力されます。
	echo $e->getLine(); // 例外が発生した行番号が出力されます。
}

// カスタム例外クラスを定義します。
class AppException extends RuntimeException
{
	private string $detail;

	public function __construct(string $message, string $detail, int $code = 0)
	{
		parent::__construct($message, $code);
		$this->detail = $detail;
	}

	public function getDetail(): string
	{
		return $this->detail;
	}
}

try {
	throw new AppException("認証エラー", "トークンの有効期限が切れています。", 401);
} catch (AppException $e) {
	echo $e->getMessage() . ": " . $e->getDetail();
}
概要

『try / catch』はPHPの例外処理構文で、実行時エラーを安全に処理するために使用します。データベース操作・ファイル操作・外部API呼び出しなど、失敗する可能性のある処理は必ず例外処理で囲んでください。例外を捕捉しないとスクリプトが停止し、ユーザーにエラーメッセージが表示されてしまいます。

『catch』ブロックでは例外の型を限定することで、エラーの種類に応じた処理が可能です。広い型である『Exception』を先に書くと、それ以降の『catch』に到達しなくなるため、具体的な型から順に記述してください。

『finally』ブロックは例外の発生有無にかかわらず必ず実行されるため、リソースの解放処理に適しています。データベースのトランザクション処理と組み合わせる場合は『beginTransaction() / commit() / rollBack()』を参照してください。JSON変換のエラー処理については『json_encode() / json_decode()』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。