PHPのエラーと例外の違いとは?try-catchを使った正しい対処法を徹底解説
PHP開発において「エラー(Error)」と「例外(Exception)」は一見似た概念に思えますが、実際には性質も対処方法も大きく異なります。本記事では、両者の違いをわかりやすく解説し、具体的なコード例とともに例外処理の基本を紹介します。
エラーと例外の主な違い
1. 回復できるかどうか
エラーは原則として回復不可能です。エラーが発生した場合、唯一の解決策は実行を終了することになります。一方、例外は try-catch ブロックで捕捉したり、呼び出し元へスローして処理を委ねたりすることで、プログラムを回復させることが可能です。
2. try-catch で扱えるかどうか
従来の致命的なエラー(Fatal Error など)は、try-catch ブロックでは捕捉できません。仮に捕捉しようとしても、アプリケーションは復帰できません。これに対して例外は try-catch ブロックで適切に処理すれば、発生後もプログラムの流れを正常に継続できます。
補足: PHP 7 以降では、多くの致命的エラーが Error クラスのインスタンスとしてスローされるようになりました。Error と Exception はどちらも Throwable インターフェースを実装しているため、catch (Throwable $e) と記述すれば両方を捕捉できます。
3. 発生原因の違い
例外はアプリケーション内部のロジックに関連するもの(データベース操作の失敗、不正な引数など)であるのに対し、エラーはアプリケーションが動作している環境やシステムレベルの問題(メモリ不足、構文ミスなど)に関連するものが中心です。
コード例:例外を捕捉する
<?php
try {
$row->insert();
$inserted = true;
} catch (Exception $e) {
echo "行の挿入中にエラーが発生しました - " . $e->getMessage();
$inserted = false;
}
echo "さらに処理を続行";
?>
解説
この例では、例外を「捕捉(catch)」しているため、プログラムの実行は中断されずに続行されます。例外は捕捉されない限りエラーのように振る舞いますが、正しくキャッチすれば、失敗した箇所の後からでも処理を継続できるのが大きな特徴です。
コード例:エラー・警告が発生するケース
<?php
$foo = [bar];
echo $foo;
?>
解説
このコードを実行すると、「PHP Notice: Array to string conversion(配列を文字列に変換しています)」という通知が出力されます。配列をそのまま文字列として出力しようとしたことが原因で、これは典型的な型・環境に関する問題です。Notice レベルの場合、デフォルト設定では処理が続行されることもありますが、コード上のバグを示すサインなので放置してはいけません。また、より深刻な Fatal Error レベルになると実行は即座に停止します。
まとめ
「エラーは基本的に回復不能で環境起因」「例外はアプリケーション起因で try-catch により回復可能」——この違いを理解しておくことで、堅牢なPHPアプリケーションを設計できます。PHP 7 以降は Throwable インターフェースによって両者の扱いが整理されているため、モダンな例外処理を積極的に活用しましょう。
-
Javaにおける例外(Exception)とエラー(Error)の違いを徹底解説
Javaにおいて、例外(Exception)とエラー(Error)はどちらも Throwable クラスのサブクラスです。しかし、両者には明確な違いがあり、堅牢なアプリケーションを開発するうえで、それぞれの特性を正しく理解することは非常に重要です。 エラー(Error)とは エラーは、主にシステムリソースの不足によって発生する深刻な問題を示します。この種の問題はアプリケーション側でキャッチ(捕捉)すべきものではなく、基本的にプログラマーが対処できる範囲を超えています。代表的な例としては、システムクラッシュやメモリ不足(OutOfMemoryError)などが挙げられます。 エラーはほとんどの
-
JavaのExceptionクラスとErrorクラスの違いを徹底解説
JavaにおけるException(例外)クラスとError(エラー)クラスは、どちらもjava.lang.Throwableクラスのサブクラスです。しかし、両者には重要な違いがあります。例外はプログラム側で捕捉・処理できるのに対し、エラーはアプリケーションで対処すべきではない重大な問題を表します。 ExceptionとErrorの共通点 両クラスともThrowableクラスを継承しており、throw文によってスロー可能なオブジェクトという点では共通しています。ただし、その性質と扱い方には大きな違いがあります。 主な違い 1. 処理の可否 例外は実行時に発生する論理的なエラーを表すオブジ