ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

try 〜 catch 構文

久々にマトモな日記。(w
自分のは相当特殊な分類だと思うので参考になるかは分かりませんが、uratchさんのトコで例外処理の話があったので便乗してみます。
こういう事を言うとshimookaさんから怒られそうですが(w、自分もtry 〜 catch 構文は(メインの処理では)使っていません。
PHP5から言語機能として備わった時、本来あるべき姿だと喜んだ半面「ど〜しよ?」と半泣きしたのも事実です。


自分は昔からエラー処理のハンドリングは以下のように行っていました。
これに慣れきってしまっている為、抜け出すのが難しくなってきています。単に怠慢です。_| ̄|○

<?php
/* エラーハンドラ用の関数を定義 */
functon abend( $array )
{
 /* エラーを通知して終了処理 */
 exit;
}

functon warninng( $array )
{
 /* エラーを通知するが処理は継続 */
}

/* エラーハンドラ(即終了)をセット */
dbms_error_handler( "abend" );
xml_error_handler( "abend" );
crypt_error_handler( "abend" );

/* エラーハンドラ(処理は継続)をセット */
http_error_handler( "warning" );
file_error_handler( "warning" );


/* 処理開始 */
$dbms_data       = dbms_get_data( "select data from hoge where huga = 0" );
$http_post_array = http_get_request_data( "POST" );
$http_contents   = http_get_contents( "http://www.example.com/" );
$xml_list        = xml_get_contents( "/tmp/foo.xml", "/list/message" );
$xml_contents    = xml_get_contents( "/tmp/foo.xml", "/list/message[@id='1']" );

if( $http_contents )
  {
   $encrypt_data = crypt_encrypt( $http_contents );
   dbms_execute_query( "insert into huga values( 2 )" );
  }
  else
  {
   $decrypt_data = crypt_decrypt( $dbms_data );
   dbms_execute_query( "insert into huga values( 3 )" );
  }

file_append( "/tmp/bar.txt", "APPEND DATA" );
$file_array = file_get_list( "/tmp/bar.txt" );
file_write( "/tmp/bar.txt", "WRITE DATA" );

?>

上記の関数名はイメージですので、ご注意ください。


はるか昔に関数の挙動が頻繁に変わるのが耐え切れなくなって殆どの処理を自前でライブラリ化したのですが、エラーハンドラの仕組みを追加して、関数名がセットされていれば(エラーが発生した時に)セットした関数へ強制的に遷移するようにしています。今でも素で使ってる関数ってmbstring系くらいじゃないかなぁ。
後、str*系関数は使わずにmb_str*系関数を使う。足りないmb_str*系関数は自作していて、mb_str_rot13関数とか、mb_str_shuffle関数とかも無駄に用意しています。今まで一度も使ったことはありませんが。(w


このエラーハンドラについては裏事情があって(当時は)エラーのハンドリングを適切に行えない輩が多かったので、こんな感じで無理やりエラーのハンドリングをしています。_| ̄|○
ある部分だけ無効にしたい場合はエラーハンドラをクリアして、その部分が終わったら再びエラーハンドラをセットします。
ただ、セットし忘れのリスクがあるので(基本方針としては)このような制御はしないよう注意しています。こういうイレギュラーな制御はバッチ処理に多くて、Webの処理では行いません。
バックトレースも一緒に渡しているので、どこで落ちたかも分かるようになっています。バックトレースは素晴らしい。。。


大きな概念で言えば、これも一種のtry 〜 catchなのかな、と。ちょっと無理やりですが。(w
後、コネクション変数とかのリソース管理もライブラリ内で行っています。接続処理とかも書くの面倒。徹底して堕落してます。_| ̄|○
何かの参考になれば幸いです。