例外処理とは
プログラムの実行中に発生したエラー(例外)に対して、そのエラーをキャッチして特定の処理を行うことが例外処理です。エラーが発生した箇所でプログラムの実行が中断されることを防ぎ、プログラムが正常に継続するための仕組みです。例外のエラーのことをException
と言います。
例外が起きた時に行う処理を用意し、この一連の処理を例外処理
と言います。
例外処理の書き方
<?php
try{
$bool = false;//bool格納
$bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
echo '通常処理が実行<br>';
//例外が起こりうる処理
} catch(Error $e){
//例外が起きた時の処理
echo '例外処理が実行<br>';
echo $e->getMessage();
}finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
//出力結果
//例外処理が実行
//Call to a member function method() on bool終了処理
tryではエラーが出ているので通常処理が実行は出力されません。
複数のcatch節
下のように***複数のcatch節つまるcatch{}***を書けます。
<?php
try{
new PDO('','','');
$bool = false;//bool格納
$bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
echo '通常処理が実行<br>';
//例外が起こりうる処理
} catch(PDOException $e){
//例外が起きた時の処理
echo 'PDOException<br>';
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} catch(Error $e){
//例外が起きた時の処理
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
//PDOException
//例外処理が実行
//PDO::__construct(): Argument #1 ($dsn) must be a valid data source name
//終了処理
上のnew PDO('','','');
をコメントアウトすると
例外処理が実行
Call to a member function method() on bool
終了処理
と出力されます。エラーが出る場所によって表示が変わってきます。
throwException(); をtryの外に書くとエラーが発生します。
<?php
function throwException(){
$bool = false;
$bool->method();
}
throwException(); //ここに記述だとエラー
try{
// new PDO('','','');
$bool = false;//bool格納
$bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
echo '通常処理が実行<br>';
//例外が起こりうる処理
} catch(PDOException $e){
//例外が起きた時の処理
echo 'PDOException<br>';
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} catch(Error $e){
//例外が起きた時の処理
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
echo 'finallyは終了しました';
throwException();をtryの中に書くと例外処理は実行されます。
<?php
function throwException(){
$bool = false;
$bool->method();
}
try{
// new PDO('','','');
$bool = false;//bool格納
$bool->method();//メソッドを呼ぶ処理 //ここでエラー発生
throwException();
echo '通常処理が実行<br>';
//例外が起こりうる処理
} catch(PDOException $e){
//例外が起きた時の処理
echo 'PDOException<br>';
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} catch(Error $e){
//例外が起きた時の処理
echo '例外処理が実行<br>';
echo $e->getMessage() .'<br>';
} finally{
//例外が起きても起きなくても必ず実行される処理
echo '終了処理<br>';
}
echo 'finallyは終了しました';
//例外処理が実行
//Call to a member function method() on bool
//終了処理
//finallyは終了しました
資料