응용 프로그램에서 동기 오류 처리

Flash Player 9 이상, Adobe AIR 1.0 이상

가장 일반적인 오류 처리는 동기 오류 처리 논리이며, 응용 프로그램이 실행되는 동안 동기 오류를 catch하기 위해 코드에 명령문을 삽입합니다. 이러한 유형의 오류 처리를 통해 함수가 실패할 경우 응용 프로그램에 런타임 오류를 알리고 복구할 수 있습니다. 동기 오류를 catch하기 위한 논리에는 try..catch..finally 문이 포함됩니다. 이 문은 글자 그대로 작업을 시도하고 Flash 런타임에서 모든 오류 응답을 catch한 다음 실패한 작업을 처리하기 위해 다른 작업을 실행합니다.

try..catch..finally 문

동기 런타임 오류가 발생하면 try..catch..finally 문을 사용하여 오류를 catch합니다. 런타임 오류가 발생하면 Flash 런타임에서 예외를 throw하여 정상적인 실행이 중지되고 Error 유형의 특수 객체가 만들어집니다. 그런 다음 이 Error 객체는 첫 번째 사용 가능한 catch 블록에 전달됩니다.

try 문에는 오류가 발생할 가능성이 있는 명령문이 포함됩니다. 따라서 try 문에는 항상 catch 문을 함께 사용합니다. try 문 블록의 명령문 중 하나에서 오류가 감지되면 해당 try 문에 연결된 catch 문이 실행됩니다.

finally 문에는 try 블록에서 오류가 발생하는지 여부와 관계없이 실행되는 명령문이 포함됩니다. 오류가 없으면 finally 블록 내의 명령문이 try 블록 명령문이 완료된 후 실행됩니다. 오류가 있으면 먼저 적합한 catch 문이 실행되고 finally 블록의 명령문이 뒤따라 실행됩니다.

다음 코드에서는 try..catch..finally 문을 사용하는 구문을 보여 줍니다.

try 
{ 
    // some code that could throw an error 
} 
catch (err:Error) 
{ 
    // code to react to the error 
} 
finally 
{ 
    // Code that runs whether an error was thrown. This code can clean 
    // up after the error, or take steps to keep the application running. 
}

catch 문은 명령문이 처리하는 특정 예외 유형을 식별합니다. catch 문은 Error 클래스의 하위 클래스인 오류 클래스만 지정할 수 있으며, 각 catch 문은 순서대로 검사됩니다. 오류 발생 유형과 일치하는 첫 번째 catch 문만 실행됩니다. 즉, 먼저 상위 수준의 Error 클래스를 검사한 다음 Error 클래스의 하위 클래스를 검사할 경우 상위 수준의 Error 클래스에서만 일치가 발생합니다. 다음 코드는 이런 상황에 대한 예입니다.

try 
{ 
    throw new ArgumentError("I am an ArgumentError"); 
} 
catch (error:Error) 
{ 
    trace("<Error> " + error.message); 
} 
catch (error:ArgumentError) 
{ 
    trace("<ArgumentError> " + error.message); 
}

이전 코드는 다음을 출력합니다.

<Error> I am an ArgumentError

ArgumentError를 정확하게 catch하려면 다음 코드와 같이 가장 세부적인 오류 유형을 먼저 나열하고 보다 일반적인 오류 유형을 그 다음에 나열합니다.

try 
{ 
    throw new ArgumentError("I am an ArgumentError"); 
} 
catch (error:ArgumentError) 
{ 
    trace("<ArgumentError> " + error.message); 
} 
catch (error:Error) 
{ 
    trace("<Error> " + error.message); 
}

ActionScript API의 여러 메서드 및 속성은 실행 시 오류가 발생하면 런타임 오류를 throw합니다. 예를 들어 다음 코드와 같이 메서드에서 오디오 스트림을 닫을 수 없는 경우 Sound 클래스의 close() 메서드에서 IOError를 throw합니다.

var mySound:Sound = new Sound(); 
try 
{ 
    mySound.close(); 
} 
catch (error:IOError) 
{ 
    // Error #2029: This URLStream object does not have an open stream. 
}

Adobe Flash Platform용 ActionScript 3.0 참조 설명서 에 익숙해지면 각 메서드 설명에 자세히 나와 있듯이 어떤 메서드에서 예외를 throw하는지 확인할 수 있습니다.

throw 문

실행 중인 응용 프로그램에서 오류가 발생하면 Flash 런타임에서 예외를 throw합니다. 또한 사용자가 직접 throw 문을 사용하여 예외를 명시적으로 발생시킬 수 있습니다. 오류를 명시적으로 발생시킬 경우 Adobe에서는 Error 클래스나 그 하위 클래스의 인스턴스를 생성할 것을 권장합니다. 다음 코드는 오류가 발생한 후 응답하기 위해 Error 클래스 인스턴스인 MyErr 를 생성하고 myFunction() 함수를 호출하는 throw 문을 보여 줍니다.

var MyError:Error = new Error("Encountered an error with the numUsers value", 99); 
var numUsers:uint = 0; 
try 
{ 
    if (numUsers == 0) 
    { 
        trace("numUsers equals 0"); 
    } 
} 
catch (error:uint) 
{ 
    throw MyError; // Catch unsigned integer errors. 
} 
catch (error:int) 
{ 
    throw MyError; // Catch integer errors. 
} 
catch (error:Number) 
{ 
    throw MyError; // Catch number errors. 
} 
catch (error:*) 
{ 
    throw MyError; // Catch any other error. 
} 
finally  
{ 
    myFunction(); // Perform any necessary cleanup here. 
}

가장 세부적인 데이터 유형이 먼저 나열되도록 catch 문이 정렬되어 있습니다. Number 데이터 유형에 대한 catch 문이 먼저 나열된 경우 uint 데이터 유형에 대한 catch 문이나 int 데이터 유형에 대한 catch 문이 모두 실행되지 않습니다.

참고: Java 프로그래밍 언어에서는 예외를 발생시킬 수 있는 각 함수의 경우, 함수 선언에 연결된 throws 절에서 발생할 수 있는 예외 클래스를 나열하여 이를 선언해야 합니다. ActionScript에서는 함수에서 발생하는 예외를 선언하지 않아도 됩니다.

간단한 오류 메시지 표시

새로운 예외 및 오류 이벤트 모델의 가장 큰 장점 중 하나는 사용자에게 액션이 실패한 시기 및 이유를 알려줄 수 있도록 한다는 것입니다. 즉, 메시지를 표시할 코드를 작성하고 그에 따른 응답 옵션을 제공할 수 있습니다.

다음 코드는 텍스트 필드에 오류를 표시하기 위한 간단한 try..catch 문을 보여 줍니다.

package 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 
     
    public class SimpleError extends Sprite 
    { 
        public var employee:XML =  
            <EmpCode> 
                <costCenter>1234</costCenter> 
                <costCenter>1-234</costCenter> 
            </EmpCode>; 
 
        public function SimpleError() 
        { 
            try 
            { 
                if (employee.costCenter.length() != 1) 
                { 
                    throw new Error("Error, employee must have exactly one cost center assigned."); 
                } 
            }  
            catch (error:Error) 
            { 
                var errorMessage:TextField = new TextField(); 
                errorMessage.autoSize = TextFieldAutoSize.LEFT; 
                errorMessage.textColor = 0xFF0000; 
                errorMessage.text = error.message; 
                addChild(errorMessage); 
            } 
        } 
    } 
}

ActionScript 3.0은 다양한 오류 클래스 및 내장 컴파일러 오류를 사용하여 ActionScript의 이전 버전보다 작업 실패 이유에 대한 보다 자세한 정보를 제공합니다. 이 정보를 참고하면 보다 나은 오류 처리를 통해 응용 프로그램을 안정적으로 작성할 수 있습니다.

오류 rethrow

응용 프로그램 작성 시 오류를 올바르게 처리할 수 없는 경우 오류를 rethrow해야 하는 상황이 있을 수 있습니다. 예를 들어 다음 코드는 중첩된 try..catch 블록에서 오류를 처리할 수 없는 경우 사용자 정의 ApplicationError를 rethrow하는 중첩된 catch 블록을 보여 줍니다.

try 
{ 
    try 
    { 
        trace("<< try >>"); 
        throw new ApplicationError("some error which will be rethrown"); 
    } 
    catch (error:ApplicationError) 
    { 
        trace("<< catch >> " + error); 
        trace("<< throw >>"); 
        throw error; 
    } 
    catch (error:Error) 
    { 
        trace("<< Error >> " + error); 
    } 
} 
catch (error:ApplicationError) 
{ 
    trace("<< catch >> " + error); 
}

이전 코드의 출력은 다음과 같습니다.

<< try >> 
<< catch >> ApplicationError: some error which will be rethrown 
<< throw >> 
<< catch >> ApplicationError: some error which will be rethrown

중첩된 try 블록은 이후 catch 블록에서 catch한 사용자 정의 ApplicationError 오류를 발생시킵니다. 이 중첩된 catch 블록에서 오류를 처리하려고 시도할 수 있으며 실패할 경우 이 블록을 포함하고 있는 try..catch 블록에 ApplicationErrorblock 객체를 throw합니다.