phpだけではなく他の言語でもよく使われるtry-catch文。
使い方を初心者の方でも分かりやすい様に解説する。
try-catch文の役割
try-catch文の役割は、
ロジック中で生まれた例外(=想定外の挙動)を検知することだ。
例えば下記の例を見て欲しい。
function addNum($a,$b){
try {
//引数$aが数字でなければ例外
if( is_numeric($a) == false){
throw new Exception(‘引数1が数字ではありません’);
}
//引数$bが数字でなければ例外
if( is_numeric($b) == false){
throw new Exception(‘引数2が数字ではありません’);
}
return $a+$b;
} catch(Exception $ex) {
//例外発生時の処理(引数◯が数字ではありませんと表示する)
$ex->getMessage();
return;
}
}
上記メソッドは、引数の数値aとbの合計を返すメソッドだ。
そして合計を計算する前に、引数aとbに数値以外の値が渡ってきている場合、想定外の値、すなわち例外とみなし、「引数◯が数字ではありませんと表示する」と言うメッセージとともに処理を止めると言うことをしている。
この時、return $a+$b の処理は実行されない。
try-catch文はなぜ必要?使いどきは?
try-catch文は、プログラマが想像できなかったバグを検知するために必要だ。
なので基本的に、ロジックを書いていて、「このロジックは難しいな」とちょっとでも感じるロジックを書く場合は、try-catch文を使用しておくことおすすめする。そんなケースは思わぬバグが発生するものだからだ。
try-catch文の使い方
では、try-catch文の役割が分かったところで、
実際にtry-catch文の使い方を確認していく。
try-catch文の構造
tyr-catch文の構造は下記のようになっている。
try {
// ロジック(処理)を記載
//例外が発生したら例外を投げる
throw new Exception();
} catch(Exception $ex) {
// 例外が渡ってくるところ
}
詳しく解説していく。
try文
try {} で囲んだ部分(tryブロック)に、例外が発生しうるロジック(例外)を書いておく。
例外が発生した場合に、throw文を記述することで、起こった例外の情報とともに、catch {} で囲んだ部分(catchブロック)へと処理を進めることができる。
throw文とは
thorow文とは、任意のタイミングで例外を発生させることができる文のことだ。
thorow文を書くことで、catch文へと処理を促すことができる。
throw new Exception();
以下、冒頭で紹介した例を元に解説する。
function addNum($a,$b){
try {
//引数$aが数字でなければ例外
if( is_numeric($a) == false){
throw new Exception(‘引数1が数字ではありません’);
}
//引数$bが数字でなければ例外
if( is_numeric($b) == false){
throw new Exception(‘引数2が数字ではありません’);
}
return $a+$b;
} catch(Exception $ex) {
//例外発生時の処理(引数◯が数字ではありませんと表示する)
$ex->getMessage();
return;
}
}
数字が渡ってくる想定の引数に対し、is_numeric関数でバリデーションを施し、
数字でなかった場合に、throw文を発生させ、例外としている。
throw文を発生させた場合、その後に記述している処理は実行されず、
次の項目で紹介する、catchブロック(catch文)へと処理が進む。
catch文
catch文内では、例外が発生した場合の処理を記述する。
引数のExceptionクラスのオブジェクトに例外情報が格納されており、そこから発生した例外情報などを取得するなどして、例外の際の処理を記述する。
} catch(Exception $ex) {
//例外の場合の処理
echo '捕捉した例外: ' . $ex->getMessage();//「引数1(または2)が数字ではありません」のメッセージ取得
}
例外処理(catch文)でよくやること
tryブロックで例外があった場合に、catchブロックに移り例外処理をするという流れが分かったところで、具体的にcatchブロック内でよくやること、処理の例などを紹介する。
①例外メッセージの取得
例外メッセージを取得する。
画面やログに例外メッセージを吐き出すことで、例外が発生していることをユーザや開発者に伝えたりする。
//例外のメッセージを取得できるgetMessageメソッド(ログに吐き出したりする)
try {
throw new Exception(‘エラーです’);
} catch(Exception $ex) {
//画面に出す例
var_dump($ex->getMessage()); //「エラーです」と画面に表示される
}
②処理を止める
catch文に処理が進んできたからと言って、catch文以降の処理が行われない訳ではない。例外がなんであろうとプログラムはそのまま動いてしまう(これは割と重要)。
それではまずいので、例外に入った段階で、処理を止めたりする
} catch(Exception $ex) {
// 処理を止める
return false;
}
//これ以降の処理は行われない
(PHP) try-catch文まとめ
- try-catch文の役割は、ロジック中で生まれた例外(=想定外の挙動)を検知すること
- try-catch文は、プログラマが想像できなかったバグを検知するために必要
通常、プログラマがプログラムを書く時は、存在しうる値やデータ、処理の流れを想定し、それ以外のデータや処理が発生しないようにプログラムを書いていく。しかし、実際にプログラムを書いていくと、上記の想定に漏れた値やデータ、処理の流れが存在し、それが原因でプログラム全体がうまく動かないと言うことがある。
このようなプログラマでも開発時に想定できなかった事象のことを「例外」と言い、この「例外」をつまみ上げて処理するためにtry-catch文は必要と言う訳だ。
自分が完璧だと思ったプログラムでも、思わぬバグが潜んでいるものなので、適材適所にtry-catch文を仕込んでおくことで、不具合に迅速に対応できるなど、よりきめ細かいシステムを提供できるのがtry-catch文を使うことのメリットだ。
https://www.php.net/manual/ja/language.exceptions.php
https://qiita.com/Chelsea/items/59436cfda149a6ac6c91
PHPなので変数には頭に$が付きます。
catch(Exception ex)はcatch(Exception $ex)
ではないでしょうか?
おっしゃる通りでした!
ご指摘ありがとうございます。