エラー処理の例:CustomErrors アプリケーション

Flash Player 9 以降、Adobe AIR 1.0 以降

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

  • XML パケットの検証

  • カスタムエラーの記述

  • カスタムエラーのスロー

  • エラースロー時のユーザーへの通知

このサンプルのアプリケーションのファイルを入手するには、 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 アプリケーションの概要

アプリケーションがロードされるとき、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); 
}