アプリケーションの同期エラーの処理

最も一般的なエラー処理は同期エラー処理のロジックで、実行時に同期エラーをキャッチするためのステートメントをコードに挿入します。この種類のエラー処理では、関数失敗時のランタイムエラーをアプリケーションで認識してそこから回復できます。同期エラーをキャッチするロジックに try..catch..finally ステートメントがあり、これは実際に操作を試し、Flash Player からのエラー応答をキャッチし、最後に、失敗した操作を処理するために何らかの操作を別に実行します。

サブトピック

try..catch..finally ステートメントの使用
throw ステートメント
単純なエラーメッセージの表示
エラーの再スロー

try..catch..finally ステートメントの使用

同期的なエラーを扱う場合は、try..catch..finally ステートメントを使用してエラーをキャッチします。ランタイムエラーが発生すると、Flash Player は例外をスローします。これは、Flash Player が通常の実行処理を中断し、Error 型の特殊なオブジェクトを作成することを意味します。この Error オブジェクトは、該当する最初の catch ブロックに送出されます。

try ステートメントは、エラーが発生する可能性のあるステートメントを囲むために使用します。try には必ず catch ステートメントが伴います。try ステートメントのブロック内にある何らかのステートメントでエラーが検出されると、その try ステートメントに対応する catch ステートメントが実行されます。

finally ステートメントで囲んだブロックは、try ブロックでエラーが発生したかどうかに関係なく実行されます。エラーが発生しなかった場合は、try ブロック内のステートメントが終了した後で、finally ブロック内のステートメントが実行されます。エラーが発生した場合は、適切な catch ステートメントがまず実行され、その後で finally ブロック内のステートメントが実行されます。

try..catch..finally ステートメントを使用する際のシンタックスを次のコードに示します。

try
{
   // エラーをスローする可能性があるコード
}
catch (err:Error)
{
   // エラーを処理するコード
}
finally
{
   // エラーがスローされたかどうかに関係なく実行されるコード。このコードは
    // エラー発生後のクリーンアップや、アプリケーションを続行するために必要な処理をここで行う。
}

個々の catch ステートメントには、そこで処理する特定の例外の型を指定します。catch ステートメントに指定できるのは Error クラスのサブクラスのみです。各 catch ステートメントは上から順にチェックされ、スローされたエラーに該当する最初の catch ステートメントだけが実行されます。したがって、先に上位レベルの Error クラスをチェックし、その Error クラスのサブクラスを後からチェックすると、上位レベルの Error クラスに対する処理しか実行されません。この動作を説明するコードを次に示します。

try
{
    throw new ArgumentError("I am an ArgumentError");
}
catch (error:Error)
{
    trace("<Error> " + error.message);
}
catch (error:ArgumentError)
{
    trace("<ArgumentError> " + error.message);
}

上のコードを実行すると、次のように表示されます。

<Error> I am an ArgumentError

ArgumentError を正しくキャッチするには、次のコードのように、最も具体的なエラーのチェックが最初で、下に行くほど一般性の強いエラーのチェックになるような順序にする必要があります。

try
{
    throw new ArgumentError("I am an ArgumentError");
}
catch (error:ArgumentError)
{
    trace("<ArgumentError> " + error.message);
}
catch (error:Error)
{
    trace("<Error> " + error.message);
}

Flash Player API に含まれるいくつかのメソッドとプロパティでは、実行中にエラーが発生するとランタイムエラーをスローします。たとえば、Sound クラスの close() メソッドでは、オーディオストリームを閉じることができない場合に IOError をスローします。次にコード例を示します。

var mySound:Sound = new Sound();
try
{
    mySound.close();
}
catch (error:IOError)
{
    // Error #2029 : この URLStream オブジェクトには開いているストリームがありません。
}

『ActionScript 3.0 コンポーネントリファレンスガイド』に慣れるに従い、各メソッドの説明に詳細が記載されているとおり、どのメソッドで例外がスローされるかがわかってくるはずです。

throw ステートメント

アプリケーション内で実行時にエラーが発生した場合は、Flash Player が例外をスローします。また、アプリケーション内で throw ステートメントを使用すれば、開発者が例外を明示的にスローすることもできます。明示的にエラーをスローした場合は、Error クラスまたはそのサブクラスのインスタンスをスローすることをお勧めします。次のコードは、Error クラス MyErr のインスタンスをスローする throw ステートメントを示し、最後に、エラーのスロー後に応答するために関数 myFunction() を呼び出しています。

var MyError:Error = new Error("Encountered an error with the numUsers value", 99);
var numUsers:uint = 0;
try
{
    if (numUsers == 0)
    {
        trace("numUsers equals 0");
    }
}
catch (error:uint)
{
    throw MyError; // 符号なし整数のエラーをキャッチする
}
catch (error:int)
{
    throw MyError; // 整数のエラーをキャッチする
}
catch (error:Number)
{
    throw MyError; // 数値のエラーをキャッチする
}
catch (error:*)
{
    throw MyError; // その他すべてのエラーをキャッチする
}
finally 
{
    myFunction(); // 必要に応じてクリーンアップを実行する
}

このように、catch ステートメントは最も限定的なデータ型から順に記述するようにしてください。Number データ型に対する catch ステートメントを最初に記述した場合は、uint データ型についても int データ型についても catch ステートメントは実行されなくなります。

メモ

 

Java プログラミング言語では、例外をスローする可能性があるすべての関数はその旨を宣言することが義務付けられています。宣言するには、スローする可能性がある例外クラスを列挙した throws 節を関数の宣言に含めます。ActionScript では、関数でスローする可能性がある例外を宣言する必要はありません。

単純なエラーメッセージの表示

新しい例外およびエラーイベントモデルがもたらす最大のメリットの 1 つに、アクションが失敗したタイミングと理由をユーザーに示すことができるという点があります。コードを記述する際、メッセージの表示と応答オプションの提示があるようにします。

次のコードは、エラーをテキストフィールドに表示する単純な try..catch ステートメントを示しています。

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    
    public class SimpleError extends Sprite
    {
        public var employee:XML = 
            <EmpCode>
                <costCenter>1234</costCenter>
                <costCenter>1-234</costCenter>
            </EmpCode>;

        public function SimpleError()
        {
            try
            {
                if (employee.costCenter.length() != 1)
                {
                    throw new Error("Error, employee must have exactly one cost center assigned.");
                }
            } 
            catch (error:Error)
            {
                var errorMessage:TextField = new TextField();
                errorMessage.autoSize = TextFieldAutoSize.LEFT;
                errorMessage.textColor = 0xFF0000;
                errorMessage.text = error.message;
                addChild(errorMessage);
            }
        }
    }
}

広範囲のエラークラスおよびビルトインのコンパイルエラーを使用することで、ActionScript 3.0 では以前のバージョンの ActionScript に比べ、何かが失敗したときにその理由に関してより多くの情報が提供されます。このため、優れたエラー処理をする、安定性の向上したアプリケーションを構築することができます。

エラーの再スロー

アプリケーションの開発時には、エラーを適切に処理できず再スローする必要が生じる場合があります。たとえば、次のコードはネストされた try..catch ブロックを含んでおり、下位の catch ブロックでエラーを処理できない場合には ApplicationError をスローしています。

try
{
    try
    {
        trace("<< try >>");
        throw new ArgumentError("some error which will be rethrown");
    }
    catch (error:ApplicationError)
    {
        trace("<< catch >> " + error);
        trace("<< throw >>");
        throw error;
    }
    catch (error:Error)
    {
        trace("<< Error >> " + error);
    }
}
catch (error:ApplicationError)
{
    trace("<< catch >> " + error);
}

このコードを実行すると次のような内容が表示されます。

<< try >>
<< catch >> ApplicationError: some error which will be rethrown
<< throw >>
<< catch >> ApplicationError: some error which will be rethrown

ネストされた try ブロックで独自の ApplicationError エラーをスローすると、それに続く catch ブロックがエラーをキャッチします。このネストされた catch ブロックではエラー処理を試みますが、処理できない場合は ApplicationError オブジェクトを上位の try..catch ブロックに対してスローします。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000102.html