Blogブログ

PHP 例外処理(try~catch)とトランザクションについて

こんにちは!
HLCのサポート担当の大谷です。
例によってPHPの初心者向け、というか自分用備忘録?的に記事をご紹介しております。

本日はエラーが発生した際の例外処理try~catch文およびトランザクション処理についてご説明します。

try~catch文の書き方

例外の発生を捕まえて、別の処理を行わせる場合は以下のように記述します

try {

	//例外の発生を捕まえたい処理

} catch(Exception $e) {

	//例外が発生した時に行う処理

}

 
これでtry内で行われた処理で例外の発生を監視し、発生した場合はcatch内の処理を行わせられます。

finallyの使い方

上記のtry~catchにはfinally(例外の発生に関係なく行う処理)を追加できます。
書き方は以下のようになります。

try {

	//例外の発生を捕まえたい処理

} catch(Exception $e) {

	//例外が発生した時に行う処理

} finally {

	//例外の発生に関係なく、必ず最後に行う処理

}

 
ポイントとしてはfinallyの処理は例外が発生しなくても実行されます。

・例外が発生しない正常な処理の順番

1.try内の処理を実行
2.finally内の処理を実行

 
・例外が発生した時の処理の順番

1.try内の処理を実行
2.例外発生
3.catch内の処理を実行
4.finally内の処理を実行

トランザクション処理の書き方

次にトランザクション処理の書き方です。

try {
	//データベース接続
$dbo = new PDO('mysql:dbname='.$dbname.';host='.$host, $user, $password);

} catch (Exception $e) {
 	
//接続失敗した時の処理

}

try {
	//データベースハンドルの属性を設定
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	//トランザクション開始
	$pdo->beginTransaction();

//データ保存などの処理

//トランザクションコミット
	$pdo->commit();
	

} catch(Exception $e) {

	//ロールバック
	$pdo->rollback();

}

 
上記の説明となりますが、トランザクションの開始と終了をまず決める必要があります。
それぞれ以下の部分がそれに当たります。

  • 開始 $pdo->beginTransaction();
  • 終了 $pdo->commit();
  •  
    開始から終了までの間をトランザクションの範囲として監視し、処理に何も問題が無ければ間の処理をまとめて実行します。

    次に、問題があった場合の処理(ロールバック)ですが、以下の部分となります。

    $pdo->rollback();

     
    上記を簡単にまとめると

  • ・beginTransaction()~commit()までがワンセットの処理だよ
  •  

  • ・何もなければcommit()でワンセットの処理をまとめて実行するよ
  •  

  • ・何かあればrollback()でワンセットの処理を中断してなかった事にするよ
  •  
    という事になります。

    必要最低限のみまとめた感じとなりましたがいかがでしょうか?
    自分自身、サポート業務の中で例外対応やトランザクション処理については見ることはあっても滅多に書く事は無いので、もうちょっと色々いじって試してみたいですね。

    それではまた!

    大谷

    執筆者

    Developer

    大谷