エラー処理の例: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); } |
![]() |