onStatusの引数をイジル

id:MIZOMIZOさーん、からさわぎの時に話してた件、解決策はいろいろあるみたいです。まず問題はonStatus時の引数であるオブジェクトがエラーの詳細を保持してないって事ですよね。やりたい事は論理エラー等をサーバサイドでExceptionとしてthrowしても、Flash側でそれを判定して、処理を振り分けられないから、エラーの詳細を取れるようにしたいと。

まずOpenAMFの挙動から説明すると、Exceptionが発生するとServiceInvocationExceptionをthrowします。このException内でonStatusの引数となるオブジェクトを生成しています。getCodeとかgetDescriptionとかはOpenAMFが故意に設定しています。単純に製品版とコンパチにしただけですね。ここに好きなプロパティを設定しちゃえば、onStatusの引数だとしても、自由自在な戻り値を得る事ができます。

ではどう実装するか。OpenAMFを直接触るのはS2OpenAMFの信念に反するので駄目です(笑)ほんとはサーバサイドで実装しなくても、設計的な事で解決できなくもないと思いますが、アプリケーションからthrowする自前のExceptionに、getCodeメソッドを定義すれば、Flash側のonStatusメソッドの引数(ignore.getCode())でエラーの内容は判断できます。おなじく自前のExceptionにgetMessageメソッドを定義(オーバーライド or コンストラクタで指定)すれば、Flash側でignore.getDescriptionでサーバサイドが設定したメッセージを取得する事ができます。

となるとExceptionのthrowの仕方を変えれば、うまくできる?すみません、おなかすいてるんでうまくまとめられません(笑)また後でちゃんと検証してみます。

#追記:アプリ側でthrowしてもS2のInvocationTargetRuntimeExceptionにラップされちゃうんですね。getCauseメソッドでthrowしたExceptionが直接Flash側に渡されるようにしてみます。
#さらに追記:↑の対応でうまくいきました。