어떠한 에러가 발생하였을 때 적절한 실행문을 실행하고자 할때는 throw문을 이용하여 탐지하도록 한다.
문법에러인 경우에는 개발시 컴파일러가 잡아주지만 그외의 에러인 경우에는 이를 통해 제어할 수 있다.
가령 동적객체에서 발생하는 에러라던가 네트웍 등에서 발생하는 에러인경우에 유동적으로 대처를 할 수 있다

* throw문은  에러를 순간 발생 시켜 Error객체를 생성하게 된다.
throw new Error( argument )
Error 객체의 생성자에는 문자열로 값을 받도록 되어있어 어떠한 에러인지를 메세지처리 할 수있다.
throw new Error( "필요한 값을 받지 못했습니다." );
throw new Error( "네트워크에 연결되지 않았습니다." );
..............
등과 같이 필요한 메세지를 전달하여 얼럿창을 이용하거나 적절한 조치를 취할 수 있도록 한다.

이처럼 에러가 발생하였을 때 처리해주는 부분은 try~catch문에서 처리하게 된다.
- throw문은 try블럭안에 작성되어있어야 하고 만약 에러가 발생하게 되면 catch문의 코드 블럭이 실행된다.
try{
명령문1
명령문2
........
throw new Error("에러가 발생하였다")
명령문3
}catch(위임된 객체:Error){
에러발생시 처리할 명령문
trace( 위임된 객체.message )
}
에러가 발생하지 않는다면 명령문1~명령문3까지 모두 실행하겠지만 명령문2 이후에 에러가 발생하면
try문에서 빠져나가 catch문의 명령문을 실행하게 된다. 이때 throw에서 생성한 Error객체의 메세지를 확인하기 위해서 catch문에 delegate를 선언하여 이 객체로 접근이 가능하다.

예1) 에러 발생만 체크
try {
 trace("1");
 trace("2");
 
throw new Error("에러 발생");
 trace("3");
} catch (obj:Error) {
 
trace(obj.message);
}

* 실행결과 : 화면에 "1    2     에러 발생" 이라고 순서대로 출력

예2) 네트워크에서 msg라는 값을 받아 처리라고 가정
var msg:String //어디선가 넘겨주게 될 값이라고 가정
try {
 if(msg == undefined){
  throw new Error("필요한 값을 받지 못하였습니다.")
  }
 trace("계속 진행");
} catch (obj:Error) {
 trace(obj.message);
}
만약 위의 코드가 네크워크에서 값을 받아 변수 msg라는 곳에 넣었다고 할때 값이 없으면 에러가 발생하고 그렇지 않으면 "계속 진행"을 출력하게 된다. 지금과 같은 경우에는 msg에 값이 없으므로 throw에 의하여 catch문의 trace가 실행하게 되지만 변수 msg = "어떠한 값"으로 값이 있는 경우에는 throw문은 실행하지 않는다.

* try문에 모든 코드를 넣자니 코드가 보기에 좋지 못하다.
  따라서 try 블럭에 함수를 넣어 실행시키도록 한다.

var id:String;
var u_name:String;
var msg:String;

//네트워크와의 통신하는 함수
function sendAndLoad():void
{
 trace("네트워크와 값을 교류했습니다.")
 각 변수들에게 받은 값을 대입...
}

//교류된 값을 정상적으로 받았는지 체크
function chkParams():void
{
 if(id == undefined) throw new Error("아이디가 없습니다.");
 if(u_name == undefined) throw new Error("이름이 없습니다.");
 if(msg == undefined) throw new Error("메세지가 없습니다.");
}

//정상적으로 값이 설정되면 실행
function makeDisplay():void
{
 trace("화면에 필요정보를 만든다.")
}

try{
 sendAndLoad();
 chkParams();  -> 실제 throw가 있는 함수
 makeDisplay();
}catch( obj:Error ){
 trace( obj.message )
}
이처럼 각 함수를 만들어 try 블럭에 넣어서 실행하면 코드가 조금은 정리되어 보인다.


* finally 블럭 : catch문 다음에 사용되며 에러가 발생하더라도 실행되는 블럭
try{
  throw new Error("에러가 발생하였다")
}catch(obj:Error){
  trace( obj.message )
}finally{
  trace("무조건 실행된다.")
}



Posted by 정윤수 버터백통

댓글을 달아 주세요