Developer

【PHP応用】 例外
2021.07.31
Lv1

【PHP応用】 例外

【PHP応用】 例外

例外は、処理内で予期せぬ動きが起きた時
(または明示的)に生成されるオブジェクトです。
例外の型(クラス)は複数あります。
全ての親となる「基底クラス」がExceptionクラスです。
エラーと例外は別物です。
(Throwableインターフェースをどちらも実装していますが、クラスとしては継承関係にありません。)

基本の構文

例外が発生する可能性がある処理をtryブロックで括り、
発生した例外をcatchブロックで捕捉(catch)する。
この時、catchの引数に指定している「例外の型」と同じか
サブクラスの例外でなければ、
catchは捕捉しません。

try{
    通常処理
}catch(例外の型  例外オブジェクト変数){
    例外処理
}

throw

例外の発生を自分が処理内で明示的に行いたい場合は、
「throw」メソッドを用います。
引数に例外オブジェクトを渡すことで、
例外を「catch」ブロックへ投げる(throw)することができます。

try{
    通常処理
    throw(new  例外の型(コンストラクタ引数));
}catch(例外の型  例外オブジェクト変数){
    例外処理
}

複数のcatch

例外の型によって例外処理を分ける場合、
「catch」ブロックを複数つなげることができます。

1つ目のcatchの例外の型が、
2つ目のcatchの例外の型の親クラスか同じクラスの場合、
2つ目のcatchブロックは通りません。
従って、catchブロックを複数つなげる場合に
例外の型に継承関係がある場合は、
子クラスの方から定義します。 

try{
    通常処理
}catch(例外の型  例外オブジェクト変数){
    例外処理
}catch(例外の型  例外オブジェクト変数){
    例外処理
}

finally

例外が発生した場合、
tryブロックの例外発生以降の処理は実行されません。
例外が発生した場合もしなかった時も
必ず実行しておきたい処理が有る場合は、
finallyブロックに記述します。

try{
    通常処理
}catch(例外の型  例外オブジェクト変数){
    例外処理
}catch(例外の型  例外オブジェクト変数){
    例外処理
}finally{
    必ず実行したい処理
}

try-catchのネスト

try-catchは内部でネスト可能です。

try{
    try{
       通常処理
    }catch(例外の型  例外オブジェクト変数){
        例外処理
    }
}catch(例外の型  例外オブジェクト変数){
    例外処理
}