【PHP】Exceptionクラスとは?例外処理の方法とtryブロックの使い方を解説!
この記事からわかること
- Exceptionクラスとは
- 例外処理のやり方
- 例外を発生させる方法
- try〜catch命令の使い方
- PDOでDB接続する時の例外処理
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
データベース接続の時や予測できるエラーが起きる時に例外処理をしていないと予期せぬ挙動を起こしたり、スクリプトが停止してしまうこともあります。
適切に例外を処理しておくと例外後の動きを操作できるので安定したプログラムになります。
今回はExceptionクラスを利用した例外処理方法をまとめていきたいと思います。
Exceptionクラスとは
ExceptionクラスはPHPの例外クラスのスーパークラス(全ての元になるクラス)です。なので他の例外クラス(ErrorExceptionやPDOException)は元であるExceptionクラスのメソッドやプロパティを継承しています。
そもそも例外とは予期せぬエラーのことを指します。誤字脱字をしたり、文法を間違えたりしてもエラーは起きてしまいます。
Exceptionクラスは以下のプロパティやメソッドを持っています。
class Exception implements Throwable {
// プロパティ
protected string $message;
protected int $code;
protected string $file;
protected int $line;
// メソッド
public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public getMessage(): string
final public getCode(): int
final public getFile(): string
final public getLine(): int
}
PHPマニュアル:定義済みの例外
Exceptionクラスのプロパティ
- $message:例外メッセージ
- $code:例外コード
- $file:例外が作られたファイルのパス
- $line:例外が作られた行
例外を発生させた時に表示させたいメッセージやその行などがプロパティに自動で格納されます。とはいえコンストラクタの通り最初メッセージは""(空文字)なのでインスタンス化時に入れ込んであげるのが通例です。
例外コードは例外が発生したコード(文)が格納されるわけではなく、例えばwebページがなかった時の「404 not found」の「404」のようなエラーコード(数値)を格納できるプロパティです。
また各プロパティは対応したメソッドによって値を取得することが可能です。
例外を自分で発生させる方法
例外はコードの不備などで自動で発生するものもありますが、自分の任意のタイミングで発生させることも可能です。このことを「例外をスローする」と言います。
例外を発生させるにはthrow命令を使います。throw命令の後に例外オブジェクトをインスタンス化することで例外を発生させます。
throw new 例外オブジェクト
インスタンス化した時にクラス内のコンストラクタが実行され、引数に指定したメッセージがプロパティ(メンバ変数)の中に格納されます。
引数は第1引数にstring型のメッセージ、第2引数にInt型のエラーコードを指定できます。
throw new Exception('エラーが起きました',500)
例外発生を感知する
ただ例外を発生させるだけでは意味がありません。例外発生時の挙動を操作するにはtry〜catch(〜finally)命令を使います。
この命令を使うことで例外が発生してもスクリプト全体を停止させずにその後の挙動を操作できるようになります。
しかしコードの誤字や構文エラーなどの致命的なエラーはtry〜catch(〜finally)命令でも防げずスクリプトが停止してしまうので注意してください。
使い方はそれぞれのブロックに適したコードを設置するだけです。
try〜catch(〜finally)命令の構文
- tryブロック→例外が発生する可能性のある処理(throwで自分で発生させても可)
- catchブロック→例外が発生した時の処理
- finallyブロック→例外発生の有無に関わらず行う処理
try〜catch(〜finally)命令の使い方
例:$_POSTの中が空の場合にエラーを発生
try{
if(empty($_POST['data'])){
throw new Exception('データが格納されていません');
}
echo "エラーが発生したらここは処理されない";
}catch(Exception $e){
echo $e->getMessage();
}finally{
echo "処理の終了";
}
まずtryブロックの中にエラーとしたい処理と実際にエラーを発生させるthrow命令
を書きます。tryブロックの中でエラーが発生すると後続の処理は行われずcatchブロックへと処理が移ります。
catchブロックの引数には例外の種類(Exception)と変数($e)を定義します。これによりエラーのオブジェクト変数を取得することができるのでそのオブジェクト変数のプロパティなどにアクセスすることでエラーメッセージなどを表示できるようになります。
明示的な例外処理を行うメリット
エラー処理をtry〜catch(〜finally)命令を使って明示的に記述する最大のメリットは「コードの可読性」かもしれません。
スクリプトの中に特殊な書き方をするtry〜catch(〜finally)命令があればここのコードはエラーが起きる可能性があったり、その後の処理を操作したいのだなと簡単に識別することができます。
またエラーが起きそうなコードをまとめてtryブロックに記述することもできますし、利便性にも長けている気がします。
データベース接続の時の例外処理方法
PHPでデータベースに接続する時は何かとエラーが起きやすいものです。
その際に適切な例外処理を施すことで予期せぬ挙動を起こさないように操作することができます。
$dsn = 'mysql:dbname="DBの名前";host="ホスト名";charset=utf8';
$user = 'ユーザ名';
$password ='パスワード';
try{
// データベースへの接続処理
$dbh = new PDO($dsn,$user,$password);
// 接続が失敗したら以下の処理はされないようにできる
echo "データベース接続後の処理";
}catch(PDOException $e){
// 接続失敗を表示
echo $e->getMessage();
} finally{
// 接続に成功してもしなくてもデータベースハンドラをリセット
$dbh = NULL;
}
データベースに接続する時にPDO(PHP Data Objects)を使う時はこのように例外処理をさせることができます。
PDOは種類が豊富にあるデータベースの操作方法や違いを隠蔽して、統一したコードで操作できるPHPに標準装備されている機能の1つです。
PDOはデータベースへの接続が失敗した時にPDOExceptionという例外を自動で発生させます。
なのでその例外をcatchブロックで捕捉することで例外メッセージを表示させることができます。
終わりに
例外処理を適切にコードに組み込むことで可読性が高く、修正もしやすいコードが書けるようになると思います。
例外処理は奥が深く、まだまだ私も勉強が足りないですが間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。