◆コード#1:エラー処理なし
まずはエラー処理無しの場合。
なんてシンプルなんでしょう。これで納品できれば天国のような(後で地獄になるような)世界ですね。
$conn = DB::connect( 'test', 'test' ); $stmt = DB::parse( $conn, 'sql statement' ); DB::execute( $stmt ); $num = DB::num_row(); for( $i = 0; $i < $num; $i ++ ) { DB::fetchRow($i); }
◆コード#2:if文でネストしたエラー処理
ここに適当にエラー処理を書加えてみます。
これはif文をネスとして処理を行ってます。こんな単純な処理にもかかわらず、ネストが4重(3重か?)になってます。これで処理が20行とか続いたらバグ発生率が高くなりそう。
$conn = DB::connect( 'test', 'test' ); if( $conn === FALSE ) { $error_msg = "DBにつながりません"; } else { $stmt = DB::parse( $conn, 'sql statement' ); if( $stmt === FALSE ) { $error_msg = "SQLが理解できません"; } else { DB::execute( $stmt ); $num = DB::num_row(); if( !$num ) { $error_msg = "データが存在しません"; } else { for( $i = 0; $i < $num; $i ++ ) { DB::fetchRow($i); // 何か処理しよう } } } }
◆コード#3:連続したif文のエラー処理
深いネストは嫌いなので、出来るだけネストしないよう、elseで続けてみます。が、一箇所大変なことになってます。こんなコード書いたら・・・
if( !$conn = DB::connect( 'test', 'test' ) ) { $error_msg = "DBにつながりません"; } else if( !$stmt = DB::parse( $conn, 'sql statement' ) ) { $error_msg = "SQLが理解できません"; } else if( DB::execute( $stmt ) || TRUE ) { // こんなコード書いたら仕事失うかも・・・ } else if( !$num = DB::num_row() ) { $error_msg = "データが存在しません"; } else { for( $i = 0; $i < $num; $i ++ ) { DB::fetchRow($i); // 何か処理しよう } }
こう書き直してみようかな。
それでも、何となく気に入らないなぁ。
DB::executeの戻り値が分からないので、怪しいコードです。
else if( DB::execute( $stmt ) && !$num = DB::num_row() ) { $error_msg = "データが存在しません"; }
◆コード#4:例外を使ったエラー処理
では例外をメッセンジャーみたいに使ってみた例です。
こういう使い方をしていいのかどうか、実はよく知らないのですが、まぁ、これはこれで動きます。メンテもやりやすそうです。例外投げると遅くなるらしいですが、めったに投げるエラーではなさそうなのでOKではないでしょうか?
class AppException extends Exception {} try { if( !$conn = DB::connect( 'test', 'test' ) ) { throw new AppException( 'DBにつながりません' ); } if( !$stmt = DB::parse( $conn, 'sql statement' ) ) { throw new AppException( 'SQLが理解できません' ); } DB::execute( $stmt ); if( ! $num = DB::num_row() ) { throw new AppException( 'データが存在しません' ); } for( $i = 0; $i < $num; $i ++ ) { DB::fetchRow($i); // 何か処理しよう } } catch( AppException $e ) { $error_msg = $e->getMessage(); }
◆コード#4b:DBが例外を投げる場合のエラー処理
最後に、この「DB」なるクラスが例外を投げる場合。
かつ、DBが例外投げたら外でキャッチしてOKな場合です。
もうちょっとシンプルになりますね。
class AppException extends Exception {} try { $conn = DB::connect( 'test', 'test' ); $stmt = DB::parse( $conn, 'sql statement' ); DB::execute( $stmt ); if( ! $num = DB::num_row() ) { throw new AppException( 'データが存在しません' ); } for( $i = 0; $i < $num; $i ++ ) { DB::fetchRow($i); // 何か処理しよう } } catch( AppException $e ) { $error_msg = $e->getMessage(); } catch( Exception $e ) { $error_msg = "申し訳ありませんッ!"; }
◆まとめ・・・のようなもの
例外を使ってエラーメッセージを処理すると楽になるかどうかですが、
後から条件を追加するのが楽だった気がします。何しろエラーと一緒にメッセージも飛ばせるので、余りコードを追いかけることなく変更できると思います。
0 件のコメント:
コメントを投稿