引き続き、実行時エラーの処理に関する話題です。前回は、同期エラーを捕まえる方法についてでした。
デバッグ用プレーヤーと通常のプレーヤーでの動作の違い
最初に、ちょっと話題が逸れますが、デバッグ用の実行環境を使う際の注意点す。
Flash Professional や Flash Builder をインストールすると、デバッグ用の実行環境が付いてきます。(単独でも入手できます) Flash が表示されている領域で、右クリックしてコンテキストメニューに 「デバッガー」という項目が表示されたら、デバッグプレーヤーがインストールされている状態です。
デバッグプレーヤーでは、エラーが発生した際、通常の実行環境よりも多くの情報を取得することができます。具体的には、以下の 2 点です。
- Error.getStackTrace() メソッドで、エラーが発生時の呼び出しスタックを取得できる。この属性は同期エラーの場合のみ利用可能。
- Error.message 属性に、詳細な情報が設定される。通常のプレーヤーでは、大抵は Error.errorID と Error.name 属性の組み合わせの短いテキスト。
他の Error の属性に関しては、どちらの実行環境でも同じになります。
throw 文
では、以下、話を戻して、
スクリプトから、明示的にエラーの発生を通知するには、throw 文を使います。
var myError = new ApplicationError("エラー発生"); throw myError;
上のスクリプトが try ブロックで囲まれていた場合、後続の catch ブロックに throw されたオブジェクトが渡されます。下は、その例です。
try { var myError = new ApplicationError("エラー発生"); throw myError; } catch (error:Error) { // このブロックにジャンプする。以下の行を実行。 trace(error.message); throw error; }
上記サンプル内の catch ブロックでは、エラーオブジェクトを再び throw しています。このようにして、一旦処理したエラーを、さらに上位の try..catch 文に渡すこともできます。
Java の場合、throw を含むメソッドは、メソッドの定義に 「エラーを投げます」 という宣言を付ける必要がありますが、ActionScript ではその必要はありません。
ちなみに、throw 文にはどんなオブジェクトも渡せます。例えば、以下のコードはコンパイルも実行も問題なく行われます。
throw new Sprite();
ただし、できるからといって、Error もしくはそのサブクラス以外のオブジェクトを throw することは推奨されていません。
ですが、人の作った SWF ファイルを読み込むときなど、エラー時にどんなオブジェクトが渡されるか不明な場合もあるかもしれません。グローバルエラーハンドラーを使うときは、Error 以外の型のオブジェクトが渡される場合も想定しておいた方が安全かもです。
詳細は、別途説明しますが、少なくとも以下の 3 種類には対応するのがよいと思われます。
if (event.error is Error) { message = Error(event.error).message; } else if (event.error is ErrorEvent) { message = ErrorEvent(event.error).text; } else { message = event.error.toString(); }
カスタムエラークラスの作成
さて、理由はともあれ、エラー発生時にどうしても Sprite オブジェクトを返したい場合、カスタムのエラークラスを作成するのが (たぶん) よい方法です。
通常は、アプリケーション固有のエラーに対する処理を記述できるようになりたいとき、カスタムのエラークラスを定義することが多いのではないかと思います。
カスタムのエラークラスは Error のサブクラスとして定義します。
public class CustomError extends Error { public function CustomError(message:String = "", errorID:int = 0) { super(message, errorID); } }
エラーの基本属性は、errorID, message, name ですが、より凝った情報を持っている場合は toString() を上書きすると便利な場合があるかもしれません。
Error クラス一覧
Error クラスは、大きく 2 種類に分けられます。
- コアの Error クラス
- ランタイムの Error クラス (flash.error パッケージ)
上記 2 つ以外に、Flash コンポーネントの Error クラスもあります。
次回は、非同期エラーの処理について。
コメントする