ushidayの日記

主に「IBMi」のメモに・・・

AMFPHPを使ってdb2_connectなどのエラーハンドル

「AMFPHPを使って、db2_connectphpDB2用関数)などのエラーハンドルが、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"=エラー内と容半ば強引にしていますが、何かもっとスマートな良い方法が無いものだろうか?

■[AMFPHPがthorwするException]

■[Flexでエラーを受けた場合]