Java経験者がPHPでハマる10選の5 「例外処理の違い」

こんにちは。ゆうせいです。

Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。

5つ目「例外処理の違い」を掘り下げます。


例外処理の違い

JavaとPHPはどちらもtry / catchを使って例外処理をしますが、「何が例外になるか」「例外の扱い方」「強制性」が大きく異なります。
Java経験者がPHPに移行すると、「エラーなのに例外にならない!」という現象に戸惑うことが多いです。


JavaとPHPの比較表

項目JavaPHP
例外の分類Checked Exception / Unchecked ExceptionException / Error(PHP7以降)
発生タイミングコンパイル時にチェックされる場合あり実行時のみ
強制性Checked Exceptionはthrows宣言とtry-catch必須例外は必須ではない(エラーを無視可能)
エラー種別ほぼすべて例外化警告(Warning)、通知(Notice)は例外化されない

サンプルコードでの違い

Java(強制される例外処理)

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("file.txt"));
    }
}

  • FileNotFoundException は Checked Exception → コンパイル時にthrowstry-catch必須

PHP(例外にならないケース)

$content = file_get_contents("file.txt");
// ファイルがなければ Warning だが例外にはならない


PHPで例外に変える方法

PHPではデフォルトでは警告やエラーは例外にならないため、手動で例外化する必要があります。

方法1:set_error_handler() を使う

set_error_handler(function($errno, $errstr) {
    throw new ErrorException($errstr, $errno);
});

方法2:例外を投げる関数を自作

if (!file_exists("file.txt")) {
    throw new Exception("File not found");
}


エラーの階層(PHP7以降)

Throwable
 ├── Exception
 │    ├── LogicException
 │    ├── RuntimeException
 │    ...
 └── Error
      ├── TypeError
      ├── ParseError
      ├── ...

JavaではThrowable配下にExceptionErrorがある構造に似ていますが、PHPは後からこの構造を取り入れたため、まだ関数ごとの仕様が統一されていません。


イメージで理解する

  • Java:交通ルールが厳しく、信号を守らないと出発できない(コンパイルエラー)
  • PHP:信号はあるけど、無視しても走れる。ただし事故ったら自己責任

実務での推奨

  1. 必要ならエラーを例外に変換して統一的に扱う
  2. ライブラリやフレームワーク(Laravel, Symfonyなど)はほぼ例外ベースなので、それに合わせる
  3. try-catchだけでなくfinallyで後処理を確実に書く

Javaは道路に必ずゲートがあるが、PHPはほぼフリーパスという違いです。

次は6つ目「null安全性の甘さ」に進めると、実行時の意図しないエラー回避の考え方が見えてきます。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。