Search

検索したいワードを入力してください

2019年04月04日

PHPのexceptionクラスを使った引数の値の比較方法

この記事では、PHPのexceptionクラスとは何か、PHPのプログラムではエラーが発生した際にどのようにエラー処理の記述を行うかその方法を説明します。エラーメッセージやエラーコードの設定や取得の方法をマスターして、エラーに強いプログラムを作りましょう。

PHPのexceptionクラスとは

PHPではプログラムの実行中に発生するエラーを例外と言い、exceptionクラスで扱います。exceptionは英語で「例外」の意味です。語源的には「ex」:”外に+「cept」:”つかむ”で”つかみ出す”ということです。正常なものの中から異常な例外をつかみ出すイメージです。

exceptionクラスにはエラーコード、エラーメッセージ、エラーが発生した場所などの情報が含まれています

例えば、データベースの接続に失敗した場合やファイルが読めなかった場合に例外が発生します。例外が発生することを例外がスローされたと言います。

例外がスローされた時に、その例外に対する処理がプログラム側で何も記述されていないと、プログラムはそこで強制終了(異常終了)されます。それを防ぐために、PHPでは例外処理という仕組みがあります。例外処理には例外が発生した場合の処理を記述します。

exceptionクラスの基本的な書き方

PHPで例外をスローするには次のように記述します。

throw new Exception();

スローされた例外を処理するにはtry-catchブロックを使用します。tryブロックは例外が発生しそうな箇所を囲んで指定します。

catchブロックには例外が発生した場合の処理を記述します。

try {
// 例外が発生しそうな処理
} catch (Exception $e) {
// 例外が発生したときの処理

tryブロックには例外発生とする条件が入ります。これには主にif文が使用されます。例外発生の条件に一致した場合に、上記の例外を投げる処理 throw new Exeption() を記述します。

exceptionの使い方

それでは、実際にexceptionを使用した例外処理のサンプルを見ながら、その使い方を確認しましょう。

try-catch構文

以下にPHPで例外処理を行うコードを示します。
変数$argの値がAの時は例外を発生させず、Bの時に例外発生としExceptionを表示させます。

//関数
function func($arg) {
try {
// $argがBだったら例外を投げる
if ($arg == "B") {
throw new Exception();
}

// $argの値を表示
echo "arg=".$arg;
} catch(Exception $e) {
echo "catch Exception.";
}
}
//関数呼び出し
func("A"); // 引数Aでfunc関数を実行
echo "\n";
func("B"); // 引数Bでfunc関数を実行

func関数は、引数($arg)の値を出力する関数です。

tryブロックのif ($arg == ”B”)で引数の値をチェックしています。引数がBの場合はthrow new Exception()で例外を発生させます。

最初に引数Aでfunc関数を実行しています。この場合は、例外が発生しないため、tryブロックの最後まで実行されます。catchブロックは実行されません。catchブロックの後の処理が実行され、func関数は終了します。

次に引数Bでfunc関数を実行しています。この場合は、例外が発生します。例外が発生すると、tryブロックの例外発生以降の処理は実行されず、catchブロックの処理が呼び出されます。

catchブロックの処理が終わると、catchブロックの後の処理が実行され、func関数は終了します。

finallyブロック

PHPの例外処理の構文には、tryブロック,catchブロックの他にfinallyブロックがあります。
finallyブロックは、必要に応じて、例外が発生しても発生しなくても必ず実行する処理を記述します

以下にfinallyブロックを使用したコードを示します。


//関数
function func($arg) {
try {
// $argがBだったら例外を投げる
if ($arg == "B") {
throw new Exception();
}

// $argの値を表示
echo "arg=".$arg;
} catch(Exception $e) {
echo "catch Exception.";
} finally {
echo "after process";
}
}

引数Aでfunc関数を実行した場合も、引数Bでfunc関数を実行した場合も、finallyブロックは実行され、”after process”と出力されます。

実はfinallyブロックを使わなくでも同じ動作を実現することは可能ですが、finallyブロック内に書くことで明示的に必ず行うことを指定できます。

実際のシステム開発では、tryブロックでリソースの取得(データベース接続やファイルのopen)を行って、finallyブロックでそのリソースの開放(データベース切断やファイルのclose)をするというロジックをよく使います。

リソースの開放を忘れるとエラーやメモリーリークの原因となるので、例外が発生してもしなくても必ずリソースの開放を行います。

getMessageで例外メッセージを取得する方法

仕事で何か問題が起こった時には、上司や顧客に『いつ、どこで、どのようなことが発生したのか』を報告します。

PHPでも例外が発生した場合、どのようなことが発生したのかわかるようにexceptionにエラーメッセージを設定してスローします。PHPでexceptionにエラーメッセージを設定するには次のように記述します。

throw new Exception(‘エラーメッセージ’);

また、exceptionからエラーメッセージを取得するには次のように記述します。

try {
//文字列‘exception’を投げる
throw new Exception('exception');
} catch(Exception $e) {
//getMessageで例外メッセージを取得
echo $e->getMessage();
}

tryブロックで設定したメッセージをcatchブロックのgetMessage()で取得しています。

getCodeで例外コードを取得する方法

プログラムでエラー内容を判別するのにエラーコードを使用します。人間には分かりやすいエラーメッセージでもプログラムの判定条件に使うには冗長なので、短いコードでエラーの種類を表現します。

PHPでexceptionにエラーコードを設定するには以下のように記述します。

throw new exception(‘エラーメッセージ’, エラーコード);

エラーコードを取得するには、exceptionクラスのgetCodeメソッドを使用します。

try {
//999というコードを設定
throw new Exception('exception!!', 999);
} catch(Exception $e) {
//コードを取得し出力する
echo $e->getCode();
}

エラー処理はシステム開発の基本

プログラミングにはエラーがつきもので、どこでどんなエラーが出ているのかをしっかりと知ることは非常に重要です。

エンジニアとして働く場合テストやバグチェックなどの業務から始める場合も多いので、しっかりと見に付けておきましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related