エラーの種類

Flash Player 9 以降、Adobe AIR 1.0 以降

アプリケーションの開発中および実行中に発生するエラーは、様々な種類があり、使用する用語が異なります。 主要なエラーの種類と用語について簡単に説明します。

  • コンパイル時エラー : ActionScript コンパイラーによるコンパイル処理の際に発生します。 コンパイル時エラーは、コードに文法的な問題があるためアプリケーションを構築できないことを示します。

  • ランタイムエラー : コンパイル済みのアプリケーションを実行している際に発生します。 ランタイムエラーとは、SWF ファイルを Flash ランタイム(Adobe Flash Player や Adobe AIR など)で再生中に発生するエラーです。多くの場合、発生と同時にランタイムエラーを処理してユーザーに報告し、アプリケーションの実行を継続するために必要な処置をとることができます。致命的なエラー(リモート Web サイトへの接続失敗、必須データのロード失敗など)の場合は、アプリケーションを安全に終了するための手段としてエラー処理を使用できます。

  • 同期エラー:関数呼び出しの際に発生するランタイムエラーです。例えば、特定のメソッドを使用し、そのメソッドに無効な引数を渡すと、Flash ランタイムが例外をスローする場合などです。ほとんどのエラーは同期的に発生(該当するステートメントを実行した時点で発生)するので、制御フローはすぐに最も適切な catch ステートメントに渡されます。

    次の抜粋コードの例では、プログラムがファイルをアップロードしようとする前に browse() メソッドを呼び出していないのでランタイムエラーがスローされます。

    var fileRef:FileReference = new FileReference(); 
    try 
    { 
        fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm")); 
    } 
    catch (error:IllegalOperationError) 
    { 
        trace(error); 
        // Error #2037: Functions called in incorrect sequence, or earlier 
        // call was unsuccessful. 
    }

    この場合、ファイルをアップロードしようとする前に browse() メソッドが呼び出されていないことが Flash Player によって検出されるので、ランタイムエラーが同期的にスローされます。

    同期エラー処理について詳しくは、 アプリケーションの同期エラーの処理 を参照してください。

  • 非同期エラーは、通常のプログラムフロー外で発生するランタイムエラーです。非同期エラーでは、エラーをキャッチするイベントおよびイベントリスナーが生成されます。非同期操作とは、関数が操作を開始してその完了を待たない操作です。エラーイベントリスナーを作成して、アプリケーションまたはユーザーからの操作を待ち、操作が失敗した場合にはイベントリスナーでエラーをキャッチして、そのエラーイベントに応答できます。イベントリスナーはイベントハンドラー関数を呼び出して、エラーイベントに有効な方法で応答します。 例えば、イベントハンドラーは、ユーザーにエラーの解決を促すダイアログボックスを起動できます。

    前に示した、ファイルアップロードの同期エラーの例で考えてみます。 browse() メソッドを正常に呼び出してからファイルのアップロードを開始した場合、Flash Player からいくつかのイベントが送出されます。例えば、アップロードが開始したときには open イベントが送出され、ファイルのアップロードが正常に完了したときには complete イベントが送出されます。イベント処理は非同期なので(つまり、事前に設定済みの時刻に発生するのではないので)、次のように addEventListener() メソッドを使用して、これら特定のイベントを監視します。

    var fileRef:FileReference = new FileReference(); 
    fileRef.addEventListener(Event.SELECT, selectHandler); 
    fileRef.addEventListener(Event.OPEN, openHandler); 
    fileRef.addEventListener(Event.COMPLETE, completeHandler); 
    fileRef.browse(); 
     
    function selectHandler(event:Event):void 
    { 
        trace("...select..."); 
        var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm"); 
        request.method = URLRequestMethod.POST; 
        event.target.upload(request); 
    } 
    function openHandler(event:Event):void 
    { 
        trace("...open..."); 
    } 
    function completeHandler(event:Event):void 
    { 
        trace("...complete..."); 
    }

    非同期エラー処理について詳しくは、 エラーイベントおよびステータスへの応答 を参照してください。

  • 不明な(キャッチされない)例外:それらのエラーに応答するための catch ステートメントなどの対応ロジックがないままスローされたエラーです。 アプリケーションでエラーがスローされたとき、エラー処理のための該当する catch ステートメントまたはイベントハンドラーが現在のレベルまたはその上位レベルで見つからない場合、そのエラーは不明な例外と見なされます。

    不明なエラーが発生すると、ランタイムは uncaughtError イベントを送出します。このイベントは「グローバルなエラーハンドラー」とも呼ばれています。このイベントは SWF の UncaughtErrorEvents オブジェクトによって送出され、 LoaderInfo.uncaughtErrorEvents プロパティを介して使用できます。 uncaughtError イベントにリスナーが登録されていない場合、ランタイムでは不明なエラーを無視し、エラーによって SWF が停止されない限り、処理を続行しようとします。

    また、デバッガーバージョンの Flash ランタイムでは、 uncaughtError イベントを送出するだけでなく、不明なエラーに応答して実行中のスクリプトを終了します。その後で、その不明なエラーを trace ステートメントの出力に表示するか、エラーメッセージをログファイルに書き込みます。例外オブジェクトが Error クラスのインスタンスまたはそのサブクラスのいずれかのインスタンスである場合、スタックトレース情報も出力に表示されます。デバッガーバージョンの Flash ランタイムの使用について詳しくは、 デバッガーバージョンの Flash ランタイムの操作 を参照してください。

    注意: uncaughtError イベントの処理中に、uncaughtError ハンドラーからエラーイベントがスローされると、このイベントハンドラーが複数回呼び出されます。これによって、例外の無限ループが発生します。このようなシナリオを回避することをお勧めします。