同期的なランタイムエラーを扱う場合は、
try..catch..finally
ステートメントを使用してエラーをキャッチします。ランタイムエラーが発生すると、Flash ランタイムは例外をスローします。これは、通常の実行処理を中断し、Error 型の特殊なオブジェクトを作成することを意味します。この Error オブジェクトは、該当する最初の
catch
ブロックにスローされます。
try
ステートメントは、エラーが発生する可能性のあるステートメントを囲みます。
try
ステートメントには必ず
catch
ステートメントが伴います。
try
ステートメントのブロック内にある何らかのステートメントでエラーが検出されると、その
try
ステートメントに対応する
catch
ステートメントが実行されます。
finally
ステートメントで囲んだステートメントは、
try
ブロックでエラーが発生したかどうかに関係なく実行されます。エラーが発生しなかった場合は、
try
ブロック内のステートメントが終了した後で、
finally
ブロック内のステートメントが実行されます。エラーが発生した場合は、適切な
catch
ステートメントがまず実行され、その後で
finally
ブロック内のステートメントが実行されます。
try..catch..finally
ステートメントを使用する際のシンタックスを次のコードに示します。
try
{
// some code that could throw an error
}
catch (err:Error)
{
// code to react to the error
}
finally
{
// Code that runs whether an error was thrown. This code can clean
// up after the error, or take steps to keep the application running.
}
個々の
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);
}
ActionScript API に含まれるいくつかのメソッドとプロパティでは、実行中にエラーが発生するとランタイムエラーをスローします。例えば、Sound クラスの
close()
メソッドは、オーディオストリームを閉じることができない場合に IOError をスローします。次にコード例を示します。
var mySound:Sound = new Sound();
try
{
mySound.close();
}
catch (error:IOError)
{
// Error #2029: This URLStream object does not have an open stream.
}
『
Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド
』をよく読むと、どのメソッドが例外をスローするかがわかります。詳しくは、各メソッドの説明に記載されています。