AMFPHPを使ってdb2_connectなどのエラーハンドル
「AMFPHPを使って、db2_connect(phpのDB2用関数)などのエラーハンドルが、AMFPHPのメッセージになってしまうけど、どうしてる?」という質問を受けたので、こんな感じにしてますというのを載せておきます。
■[db2_connect()]
$db=db2_connect($dbname,$dbuser,$dbpwd,$option); // 接続エラー if(!$db){ $message = "db2_connectでエラー -> <". date('Y/m/d H:i:s') .">" .db2_conn_errormsg() . "\n"; error_log($message, 3, '/var/tmp/AS400ConnectionError.log'); return $message; }
■[db2_exec()]
$sql="select * from {$dbfile} fetch first 15 rows only "; // SQL処理はAMFPHPでエラーをthrowしてくる try { $result = db2_exec($db,$sql); } catch (Exception $e) { // SQLエラー if(!$result){ $message = "db2_execでエラー -> <". date('Y/m/d H:i:s') .">\n" .db2_stmt_errormsg() . "\n" .$e->__toString() . "\n"; error_log($message, 3, '/var/tmp/AS400SQLStatementError.log'); db2_close($db); return $message; } }
■[Flex側]
private function onResult(etc:*):void { if (typeof etc == 'object') { dataList = new ArrayCollection(etc); } else { Alert.show(etc.toString()); //エラー } }
”db2_connect”も”db2_exec”も関数でエラーが起きても”false”が返されるだけとなっているが、実際エラーを起こしてみると、”db2_connect”は”flase”に対する処理だけで問題ないのですが、SQLに関わるエラー(db2_prepareも同じ)は、AMFPHPがExceptionをスローしてきます。その為、”try〜catch”が必要になってくるようです。
結局エラーハンドルといっても、PHPの処理はFlexからすると、ただのサービスのなので、「仮に結果がエラーだとしても、メッセージとして受けるしかないのかな?」と思い、正常時の戻り値がObjectという前提で、"String"=エラー内と容半ば強引にしていますが、何かもっとスマートな良い方法が無いものだろうか?
■[Flexでエラーを受けた場合]