エラー処理の例:CustomErrors アプリケーションFlash Player 9 以降、Adobe AIR 1.0 以降 ここでは CustomErrors アプリケーションを使って、アプリケーション構築時のカスタムエラーを操作する手法について示します。 それらの手法は、次のとおりです。
このサンプルのアプリケーションのファイルを入手するには、www.adobe.com/go/learn_programmingAS3samples_flash_jp を参照してください。 CustomErrors アプリケーションのファイルは、Samples/CustomError フォルダーにあります。 このアプリケーションは次のファイルで構成されています。
CustomErrors アプリケーションの概要アプリケーションがロードされるとき、Flex アプリケーションでは initApp() メソッドが 呼び出され、Flash Professional アプリケーションではタイムライン(非関数)コードが実行されます。このコードは、Validator クラスによって検証されるサンプルの XML パケットを定義します。次のコードが実行されます。 employeeXML =
<employee id="12345">
<firstName>John</firstName>
<lastName>Doe</lastName>
<costCenter>12345</costCenter>
<costCenter>67890</costCenter>
</employee>;
}
XML パケットは後で、TextArea コンポーネントインスタンスのステージ上に表示されます。 この手順により、再検証を試みる前に XML パケットを変更できます。 ユーザーが「Validate」ボタンをクリックすると、validateData() メソッドが呼び出されます。このメソッドは、Validator クラスの validateEmployeeXML() メソッドを使用して、従業員 XML パケットを検証します。validateData() メソッドのコードを次に示します。 function validateData():void
{
try
{
var tempXML:XML = XML(xmlText.text);
Validator.validateEmployeeXML(tempXML);
status.text = "The XML was successfully validated.";
}
catch (error:FatalError)
{
showFatalError(error);
}
catch (error:WarningError)
{
showWarningError(error);
}
catch (error:Error)
{
showGenericError(error);
}
}
最初に、TextArea コンポーネントインスタンス xmlText のコンテンツを使用して、一時的な XML オブジェクトが作成されます。次に、独自の Validator クラス(com.example.programmingas3/errors/Validator.as)の validateEmployeeXML() メソッドが呼び出され、一時的な XML オブジェクトをパラメーターとして渡します。XML パケットが有効な場合、Label コンポーネントインスタンス status が成功メッセージを表示して、アプリケーションが終了します。validateEmployeeXML() メソッドがカスタムエラーをスローした(つまり、FatalError、WarningError または汎用 Error が発生した)場合は、適切な catch ステートメントを実行して、showFatalError()、showWarningError() または showGenericError() メソッドのいずれかを呼び出します。これらの各メソッドは、適切なメッセージを statusText というテキスト領域に表示して、発生した具体的なエラーをユーザーに通知します。各メソッドは、具体的なメッセージで Label コンポーネントインスタンス status の更新も行います。 従業員 XML パケットを検証しようとしたときに致命的なエラーが発生した場合は、次のコードが示すように、そのエラーメッセージが statusText テキスト領域に表示され、TextArea コンポーネントインスタンス xmlText および Button コンポーネントインスタンス validateBtn が無効になります。 function showFatalError(error:FatalError):void
{
var message:String = error.message + "\n\n";
var title:String = error.getTitle();
statusText.text = message + " " + title + "\n\nThis application has ended.";
this.xmlText.enabled = false;
this.validateBtn.enabled = false;
hideButtons();
}
致命的なエラーではなく警告エラーが発生した場合は、そのエラーメッセージが statusText TextArea インスタンスに表示されますが、xmlText TextField および Button コンポーネントインスタンスは無効になりません。showWarningError() メソッドが、カスタムエラーメッセージを statusText テキスト領域に表示します。また、このメッセージでは、XML の検証を続行するか、スクリプトを中止するかをユーザーに尋ねます。showWarningError() メソッドの抜粋コードを次に示します。 function showWarningError(error:WarningError):void
{
var message:String = error.message + "\n\n" + "Do you want to exit this application?";
showButtons();
var title:String = error.getTitle();
statusText.text = message;
}
ユーザーが「Yes」または「No」ボタンをクリックすると、closeHandler() メソッドが呼び出されます。closeHandler() メソッドの抜粋コードを次に示します。 function closeHandler(event:CloseEvent):void
{
switch (event.detail)
{
case yesButton:
showFatalError(new FatalError(9999));
break;
case noButton:
statusText.text = "";
hideButtons();
break;
}
}
ユーザーが「Yes」をクリックしてスクリプトの中止を選択した場合は、FatalError がスローされ、その結果、アプリケーションは終了します。 独自のバリデーターの構築独自の Validator クラスは、1 つのメソッド validateEmployeeXML() を含みます。validateEmployeeXML() メソッドは、1 つの引数 employee(検証対象の XML パケット)を受け取ります。validateEmployeeXML() メソッドを次に示します。 public static function validateEmployeeXML(employee:XML):void
{
// checks for the integrity of items in the XML
if (employee.costCenter.length() < 1)
{
throw new FatalError(9000);
}
if (employee.costCenter.length() > 1)
{
throw new WarningError(9001);
}
if (employee.ssn.length() != 1)
{
throw new FatalError(9002);
}
}
検証のため、従業員は 1 つ(1 つのみ)の原価部門に属していなければなりません。 従業員がいずれの原価部門にも属していない場合は、FatalError がスローされてメインアプリケーションファイルの validateData() メソッドに移ります。従業員が複数の原価部門に属している場合は、WarningError がスローされます。 XML バリデーターの最終チェックでは、ユーザーに定義されている社会保障番号が厳密に 1 つであることを確認します(XML パケットの ssn ノード)。存在する ssn ノードが厳密に 1 つでない場合は、FatalError エラーがスローされます。 validateEmployeeXML() メソッドにチェックを追加することもできます。例えば、ssn ノードに格納されている番号が有効であることを確認する場合や、従業員に少なくとも 1 つの電話番号と電子メールアドレスが割り当てられていて、その両方の値が有効であることを確認する場合などです。各従業員に一意の ID を割り当てその上司の ID を指定するために、XML を変更することもできます。 ApplicationError クラスの定義ApplicationError クラスは、FatalError および WarningError の両方の基本クラスとして機能します。 ApplicationError クラスは Error クラスを拡張して、独自にメソッドおよびプロパティを定義します。エラー ID、重大度、独自のエラーコードおよびメッセージを格納する XML オブジェクトなどを定義します。 このクラスでは、エラーの種類ごとの重大度を定義するのに使用する 2 つの静的定数も定義します。 ApplicationError クラスのコンストラクターメソッドを次に示します。 public function ApplicationError()
{
messages =
<errors>
<error code="9000">
<![CDATA[Employee must be assigned to a cost center.]]>
</error>
<error code="9001">
<![CDATA[Employee must be assigned to only one cost center.]]>
</error>
<error code="9002">
<![CDATA[Employee must have one and only one SSN.]]>
</error>
<error code="9999">
<![CDATA[The application has been stopped.]]>
</error>
</errors>;
}
XML オブジェクトの各エラーコードは、一意の数値コードとエラーメッセージを格納します。 次の getMessageText() メソッドが示すように、エラーメッセージは、E4X を使用してエラーコードで簡単に調べることができます。 public function getMessageText(id:int):String
{
var message:XMLList = messages.error.(@code == id);
return message[0].text();
}
getMessageText() メソッドは、1 つの整数引数 id を受け取り、ストリングを返します。id 引数には、調べるエラーのエラーコードを指定します。例えば、id を 9001 で渡すと、従業員は 1 つの原価部門にのみ割り当てられる必要があることを示すエラーを受け取ります。複数のエラーでエラーコードが同じ場合、ActionScript は検出された最初の結果のみについてエラーメッセージを返します(返された XMLList オブジェクトの message[0])。 このクラスの次のメソッドである getTitle() はパラメーターを受け取らず、この特定のエラーのエラー ID を格納するストリング値を返します。この値を使用すると、XML パケットの検証時に発生した正確なエラーを簡単に識別できます。getTitle() メソッドの抜粋コードを次に示します。 public function getTitle():String
{
return "Error #" + id;
}
ApplicationError クラスの最後のメソッドは toString() です。このメソッドは、エラーメッセージの表現をカスタマイズするために、Error クラスに定義されている関数をオーバーライドします。 発生した特定のエラー番号とメッセージを識別するストリングを返します。 public override function toString():String
{
return "[APPLICATION ERROR #" + id + "] " + message;
}
FatalError クラスの定義FatalError クラスは独自の ApplicationError クラスを拡張して、3 つのメソッド(FatalError コンストラクター、getTitle() および toString())を定義します。最初のメソッドである FatalError コンストラクターは、1 つの整数引数 errorID を受け取り、ApplicationError クラスに定義されている静的定数値を使用してエラーの重大度を設定し、ApplicationError クラスの getMessageText() メソッドを呼び出して特定のエラーのエラーメッセージを取得します。FatalError コンストラクターを次に示します。 public function FatalError(errorID:int)
{
id = errorID;
severity = ApplicationError.FATAL;
message = getMessageText(errorID);
}
FatalError クラスの次のメソッドである getTitle() は、ApplicationError クラスで以前に定義された getTitle() メソッドをオーバーライドし、致命的なエラーが発生したことをユーザーに通知するためにタイトルにテキスト「-- FATAL」を追加します。getTitle() メソッドを次に示します。 public override function getTitle():String
{
return "Error #" + id + " -- FATAL";
}
このクラスの最後のメソッドである toString() は、ApplicationError クラスに定義されている toString() メソッドをオーバーライドします。toString() メソッドを次に示します。 public override function toString():String
{
return "[FATAL ERROR #" + id + "] " + message;
}
WarningError クラスの定義WarningError クラスは ApplicationError クラスを拡張し、FatalError クラスとほぼ同一です。ただし、次のコードが示すようなマイナー変更があり、エラー重大度は ApplicationError.FATAL ではなく ApplicationError.WARNING に設定されます。 public function WarningError(errorID:int)
{
id = errorID;
severity = ApplicationError.WARNING;
message = super.getMessageText(errorID);
}
|
|