Prog4のエラーハンドリング
Progression4になって、Commandのエラー処理のしかたが微妙にかわりました。
CommandクラスのcatchErrorというプロパティにエラー処理をする関数を設定します。引数はエラーが発生したCommandインスタンスと、発生したエラーとなります。以前のerrorメソッドは廃止されました。
一般的な書き方
var command:Command = new LoadURL( url ); command.catchError=function( target:Command, err:Error ):void { // ここで何かエラー処理 target.executeComplete(); } command.execute();
このように、エラー内容に応じて処理することができます。エラーが解決した場合は、エラーが発生したCommandインスタンスのexecuteCompleteメソッドを呼び出すことでCommandを終了させます。
エラーに対して適切な処理ができない場合はそのままにするとCommand内部でさらに throw されるため、通常通りエラーが発生します。(他の処理にまかせるかたちになります)
とりあえずここでエラーを止めたい(エラーを無視して次に行きたい)のであれば、executeCompleteを呼べばOKです。
別の書き方
catchErrorはプロパティなので、CommandのinitObjectで設定することもできます。見づらいですがいちいち変数にいれてプロパティをセットしたくない場合は有効です。
var command:Command = new LoadURL( url, { catchError:function( target:Command, err:Error ):void { target.executeComplete(); } } ); command.execute();
便利な使い方
また、エラー関数に渡される引数 target には該当のCommandインスタンスが渡されるため、リスト系のCommandでのエラーを一括で処理するようにすることも可能です。Commandの種類が複数あってもswitch構文などで分岐すれば良いでしょう。
var command:CommandList = new LoaderList(); command.addCommand( new LoadURL( url ), new LoadSWF( swfUrl1 ), new LoadSWF( swfUrl2) ); command.catchError=function( target:Command, err:Error ):void { switch(true){ caes target is LoadURL: // LoadURLの時用の処理 break; caes target is LoadSWF: break; // LoadSWFの時用の処理 } target.executeComplete(); } command.executea();
このとき targetの型指定をLoadURLのようにすることも一応できるので内容がわかっていてキャストが面倒な場合は受けとる時点でキャストしておけばいいでしょう。
中断したい場合
リスト系のCommandを状況によって中断したい場合は、該当のCommand(子)を一旦executeCompleteしたうえで、リストCommand(親)を中断するか、Returnコマンドを挿入すると安全に中断できます。interruptした場合、Prog3と違って即座に中断されます。
var command:CommandList = new LoaderList(); command.addCommand( new LoadURL( url ), new LoadSWF( swfUrl1 ), new LoadSWF( swfUrl2) ); command.catchError=function( target:Command, err:Error ):void { target.executeComplete(); // this.interrupt(); this.insertCommand( new Return() ); } command.executea();
ひとつのクオリティとして、例外処理は大切な処理です。めんどくさいですがProgression4の登場により比較的わかりやすく扱えるようになりました。ぜひ活用してみてください。