例: CustomErrors アプリケーション

ここでは CustomErrors アプリケーションを使って、アプリケーション構築時のカスタムエラーを操作する手法について示します。それらの手法は、次のとおりです。

このサンプルのアプリケーションファイルを入手するには、www.adobe.com/go/learn_programmingAS3samples_flash_jp を参照してください。CustomErrors アプリケーションのファイルは、"Samples/CustomError" フォルダにあります。アプリケーションは、次のファイルで構成されています。

ファイル

説明

CustomErrors.mxml

または

CustomErrors.fla

Flash (FLA) または Flex (MXML) のメインアプリケーションファイル

com/example/programmingas3/errors/ApplicationError.as

FatalError および WarningError の両方の基本エラークラスとして機能するクラス。

com/example/programmingas3/errors/FatalError.as

アプリケーションによるスローの可能性がある FatalError エラーを定義するクラス。このクラスは独自の ApplicationError クラスを拡張します。

com/example/programmingas3/errors/Validator.as

ユーザー指定の従業員 XML パケットを検証する単一のメソッドを定義するクラス。

com/example/programmingas3/errors/WarningError.as

アプリケーションによるスローの可能性がある WarningError エラーを定義するクラス。このクラスは独自の ApplicationError クラスを拡張します。

サブトピック

CustomErrors アプリケーションの概要
独自のバリデータの構築
ApplicationError クラスの定義
FatalError クラスの定義
WarningError クラスの定義

CustomErrors アプリケーションの概要

CustomErrors.mxml ファイルは、カスタムエラーアプリケーション用のユーザーインターフェイスと一部のロジックを含みます。アプリケーションの creationComplete イベントが送出されると、initApp() メソッドが呼び出されます。このメソッドは、Validator クラスによって検証されるサンプルの XML パケットを定義します。initApp() メソッドのコードを次に示します。

private function initApp():void
{
    employeeXML = 
        <employee id="12345">
            <firstName>John</firstName>
            <lastName>Doe</lastName>
            <costCenter>12345</costCenter>
            <costCenter>67890</costCenter>
        </employee>;
}

XML パケットは後で、TextArea コンポーネントインスタンスの Stage に表示されます。このため、再検証を試みる前に XML パケットを変更できます。

ユーザーが Validate ボタンをクリックすると、validateData() メソッドが呼び出されます。このメソッドは、Validator クラスの validateEmployeeXML() メソッドを使用して、従業員 XML パケットを検証します。validateData() メソッドのコードを次に示します。

public 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() メソッドのいずれかを呼び出します。これらの各メソッドは、適切なメッセージを Alert コンポーネントに表示して、発生した具体的なエラーをユーザーに通知します。各メソッドは、具体的なメッセージで Label コンポーネントインスタンス status の更新も行います。

従業員 XML パケットを検証しようとしたときに致命的なエラーが発生した場合は、次のコードが示すように、そのエラーメッセージが Alert コンポーネントに表示され、TextArea コンポーネントインスタンス xmlText および Button コンポーネントインスタンス validateBtn が無効になります。

public function showFatalError(error:FatalError):void
{
    var message:String = error.message + "\n\n" + "Click OK to end.";
    var title:String = error.getTitle();
    Alert.show(message, title);
    status.text = "This application has ended.";
    this.xmlText.enabled = false;
    this.validateBtn.enabled = false;
}

致命的なエラーではなく警告エラーが発生した場合は、そのエラーメッセージが Alert コンポーネントに表示されますが、TextField および Button コンポーネントインスタンスは無効になりません。showWarningError() メソッドが、カスタムエラーメッセージを Alert コンポーネントインスタンスに表示します。このメッセージでは、XML の検証を続行するかスクリプトを中止するかの質問もユーザーに表示します。showWarningError() メソッドの抜粋コードを次に示します。

public function showWarningError(error:WarningError):void
{
    var message:String = error.message + "\n\n" + "Do you want to exit this application?";
    var title:String = error.getTitle();
    Alert.show(message, title, Alert.YES | Alert.NO, null, closeHandler);
    status.text = message;
}

Yes または No ボタンを使用してユーザーが Alert コンポーネントインスタンスを閉じると、closeHandler() メソッドが呼び出されます。closeHandler() メソッドの抜粋コードを次に示します。

private function closeHandler(event:CloseEvent):void
{
    switch (event.detail)
    {
        case Alert.YES:
            showFatalError(new FatalError(9999));
            break;
        case Alert.NO:
            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() はパラメータを 1 つも受け取らず、この特定のエラーのエラー ID を格納するストリング値を返します。この値は Alert コンポーネントのタイトルで使用すると、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);
}

 

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

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