오류 처리 예제: CustomErrors 응용 프로그램

Flash Player 9 이상, Adobe AIR 1.0 이상

CustomErrors 응용 프로그램은 응용 프로그램 작성 시 사용자 정의 오류 작업에 관련된 기술에 대해 설명합니다. 이러한 기술은 다음과 같습니다.

  • XML 패킷 유효성 검사

  • 사용자 정의 오류 작성

  • 사용자 정의 오류 발생

  • 오류 발생 시 사용자에게 알림

이 샘플에 대한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr를 참조하십시오. CustomErrors 응용 프로그램 파일은 Samples/CustomError 폴더에 있습니다. 이 응용 프로그램은 다음과 같은 파일로 구성됩니다.

File

설명

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 응용 프로그램 개요

응용 프로그램이 로드되면 initApp() 메서드가 Flex 응용 프로그램에 대해 호출되거나 타임라인(비함수) 코드가 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 패킷이 유효한 경우 status Label 구성 요소 인스턴스에 성공 메시지가 표시되며 응용 프로그램이 종료됩니다. validateEmployeeXML() 메서드에서 사용자 정의 오류(FatalError, WarningError 또는 일반 오류 발생)가 발생한 경우 적합한 catch 문이 실행되며 showFatalError(), showWarningError() 또는 showGenericError() 메서드가 호출됩니다. 이 메서드는 각각 사용자에게 특정 오류 발생을 알리기 위해 statusText라는 텍스트 영역에 적합한 메시지를 표시하며, 특정 메시지로 status Label 구성 요소도 업데이트합니다.

직원 XML 패킷에 대한 유효성 검사 중 치명적 오류가 발생하면 다음 코드와 같이 statusText 텍스트 영역에 오류 메시지가 표시되고 xmlText TextArea 구성 요소 인스턴스 및 validateBtn Button 구성 요소 인스턴스가 비활성화됩니다.

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 클래스에는 단일 메서드인 validateEmployeeXML()이 포함됩니다. validateEmployeeXML() 메서드는 유효성을 검사하려는 XML 패킷인 employee를 단일 인수로 취합니다. 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); 
    } 
}

유효성을 검사하기 위해서는 직원이 단일 비용 센터에 속해 있어야 합니다. 직원이 어느 비용 센터에도 속해 있지 않은 경우 메서드에서 FatalError가 발생하며, 이는 기본 응용 프로그램 파일에서 validateData() 메서드가 실행되도록 합니다. 직원이 둘 이상의 비용 센터에 속해 있는 경우 WarningError가 발생합니다. XML 유효성 검사기의 최종 점검 절차는 사용자의 주민등록 번호가 정확하게 정의되었는지 확인하는 것입니다(XML 패킷의 ssn 노드). 정확히 하나의 ssn 노드가 없는 경우 FatalError 오류가 발생합니다.

validateEmployeeXML() 메서드에 ssn 노드에 유효한 번호가 포함되었는지 또는 직원에게 최소한 하나의 전화 번호 및 전자 메일 주소가 정의되어 있는지 및 두 값이 모두 유효한지 등의 점검 사항을 추가할 수 있습니다. 또한 XML을 수정하여 각 직원이 고유한 ID를 가지고 해당 관리자 ID를 지정하도록 할 수 있습니다.

ApplicationError 클래스 정의

ApplicationError 클래스는 FatalError 및 WarningError 클래스 모두에 대해 기본 클래스 역할을 합니다. ApplicationError 클래스는 Error 클래스를 확장하며 오류 ID, 심각도 및 사용자 정의 오류 코드 및 메시지를 포함하는 XML 객체를 비롯한 고유한 사용자 정의 메서드 및 속성을 정의합니다. 이 클래스는 또한 각 오류 유형의 심각도를 정의하는 데 사용되는 두 개의 정적 상수도 정의합니다.

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() 메서드는 단일 정수 인수인 id를 취하여, 문자열을 반환합니다. id 인수는 조회할 오류에 대한 오류 코드입니다. 예를 들어 id로 9001을 전달하면 직원은 하나의 비용 센터에만 할당되어야 한다는 오류 메시지가 검색됩니다. 둘 이상의 오류에 동일한 오류 코드가 있을 경우 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 클래스를 확장하며, FatalError 생성자, getTitle()toString()의 세 가지 메서드를 정의합니다. 첫 번째 메서드인 FatalError 생성자는 단일 정수 인수인 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 클래스를 확장하며 다음 코드와 같이 문자열이 조금 변경되고 오류 심각도를 ApplicationError.FATAL이 아닌 ApplicationError.WARNING으로 설정하는 것만 제외하면 FatalError 클래스와 거의 동일합니다.

public function WarningError(errorID:int) 
{ 
    id = errorID; 
    severity = ApplicationError.WARNING; 
    message = super.getMessageText(errorID); 
}