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 パラメータには、etheException、または 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()); 
}

関連項目

Error


 

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

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