Flash CS3 ドキュメンテーション |
|||
| ActionScript 2.0 リファレンスガイド > ActionScript 言語エレメント > ステートメント > try..catch..finally ステートメント | |||
try {
// ... try block ...
} finally {
// ... finally block ...
}
try {
// ... try block ...
} catch(error [:ErrorType1]) {
// ... catch block ...
} [catch(error[:ErrorTypeN]) {
// ... catch block ...
}] [finally {
// ... finally block ...
}]
エラーが発生する可能性のあるコードブロックを囲み、そのエラーに対処します。try コードブロック内のコードで throw ステートメントを使用してエラーをスローすると、catch ブロックがある場合は、そのブロックに制御が移ります。さらに finally ブロックがある場合は、そのブロックが実行されます。finally ブロックは、エラーがスローされたかどうかに関係なく、必ず実行されます。try ブロック内のコードがエラーをスローしない場合 (try ブロックの実行が正常に終了した場合) でも、finally ブロックのコードは実行されます。return ステートメントを使用して try ブロックを終了した場合でも、finally ブロックは実行されます。
try ブロックの後には、catch ブロックまたは finally ブロック、またはその両方を続ける必要があります。1 つの try ブロックに対して複数の catch ブロックを指定できますが、finally ブロックは 1 つしか記述できません。try ブロックは、必要なだけ何レベルでもネストできます。
catch ハンドラで指定する error パラメータには、e、theException、または x のような単純な識別子を使用します。catch ハンドラの変数は、タイプ付きにすることもできます。複数の catch ブロックを使用する場合は、型付きエラーを使用すれば、1 つの try ブロックからスローされる複数の型のエラーをキャッチできます。
スローした例外がオブジェクトである場合、スローしたオブジェクトが指定したタイプのサブクラスであれば、タイプが一致します。特定のタイプのエラーをスローした場合は、対応するエラーを処理する catch ブロックが実行されます。指定したタイプではない例外がスローされた場合は、catch ブロックは実行されず、try ブロックからそのエラーに一致する外部の catch ハンドラに対して例外が自動的にスローされます。
関数の内部でエラーをスローし、その関数に catch ハンドラが含まれていない場合、その関数は終了します。catch ブロックが見つからない限り、呼び出し元の関数もすべて終了します。このプロセスの間に、すべてのレベルの finally ハンドラが呼び出されます。
対応バージョン : ActionScript 1.0、Flash Player 7
error:Object - throw ステートメントでスローされる式。通常は Error クラスまたはそのサブクラスのインスタンスです。
次の例では、try..finally ステートメントの作成方法を示します。finally ブロックのコードは必ず実行されるので、通常、try ブロックの実行後に必要な "後処理" を実行するために使用されます。次の例では、setInterval() を使用して 1000 ミリ秒 (1 秒) ごとに関数を呼び出します。エラーが発生すると、エラーがスローされて catch ブロックでキャッチされます。エラーの有無に関係なく、finally ブロックは必ず実行されます。setInterval() が使用されているので、finally ブロックに clearInterval() を配置して、メモリから間隔を消去する必要があります。
myFunction = function () {
trace("this is myFunction");
};
try {
myInterval = setInterval(this, "myFunction", 1000);
throw new Error("my error");
}
catch (myError:Error) {
trace("error caught: "+myError);
}
finally {
clearInterval(myInterval);
trace("error is cleared");
}
次の例では、エラーの有無にかかわらず、finally ブロックを使って ActionScript オブジェクトを削除します。"Account.as" という名前で新しい AS ファイルを作成します。
class Account {
var balance:Number = 1000;
function getAccountInfo():Number {
return (Math.round(Math.random() * 10) % 2);
}
}
"Account.as" と同じディレクトリに新しい AS ドキュメントまたは FLA ドキュメントを作成し、タイムラインのフレーム 1 に次の ActionScript を入力します。
import Account;
var account:Account = new Account();
try {
var returnVal = account.getAccountInfo();
if (returnVal != 0) {
throw new Error("Error getting account information.");
}
}
finally {
if (account != null) {
delete account;
}
}
これは try..catch ステートメントの使用例です。try ブロック内のコードが実行されます。try ブロック内のコードで例外がスローされると、制御が catch ブロックに移ります。それにより、Error.toString() メソッドを使ってテキストフィールドにエラーメッセージが表示されます。
"Account.as" と同じディレクトリに新しい FLA ドキュメントを作成し、タイムラインのフレーム 1 に次の ActionScript を入力します。
import Account;
var account:Account = new Account();
try {
var returnVal = account.getAccountInfo();
if (returnVal != 0) {
throw new Error("Error getting account information.");
}
trace("success");
}
catch (e) {
this.createTextField("status_txt", this.getNextHighestDepth(), 0, 0, 100, 22);
status_txt.autoSize = true;
status_txt.text = e.toString();
}
次の例では、1 つの try コードブロックに対して複数の型付き catch コードブロックを使用します。try ブロックでは、発生したエラーのタイプに応じてさまざまなタイプのオブジェクトをスローします。この例の myRecordSet は、RecordSet という (架空の) クラスのインスタンスです。このクラスの sortRows() メソッドは RecordSetException および MalformedRecord の 2 種類のエラーをスローする可能性があります。
次の例において、RecordSetException オブジェクトと MalformedRecord オブジェクトは Error クラスのサブクラスです。それぞれが独自の AS クラスファイルで定義されています。
// In RecordSetException.as:
class RecordSetException extends Error {
var message = "Record set exception occurred.";
}
// In MalformedRecord.as:
class MalformedRecord extends Error {
var message = "Malformed record exception occurred.";
}
RecordSet クラスの sortRows() メソッドでは、発生した例外のタイプに応じて、これらの定義済みオブジェクトのいずれかをスローします。次に例を示します。
class RecordSet {
function sortRows() {
var returnVal:Number = randomNum();
if (returnVal == 1) {
throw new RecordSetException();
}
else if (returnVal == 2) {
throw new MalformedRecord();
}
}
function randomNum():Number {
return Math.round(Math.random() * 10) % 3;
}
}
最後に、他の AS ファイルまたは FLA スクリプトでは、次のコードを使って、RecordSet クラスのインスタンスの sortRows() メソッドを呼び出します。このコードでは、sortRows() でスローされるエラーのタイプごとに、catch ブロックを定義します。
import RecordSet;
var myRecordSet:RecordSet = new RecordSet();
try {
myRecordSet.sortRows();
trace("everything is fine");
}
catch (e:RecordSetException) {
trace(e.toString());
}
catch (e:MalformedRecord) {
trace(e.toString());
}
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート
現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00001340.html