2021.07.31
【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(例外の型 例外オブジェクト変数){ 例外処理 }