예외처리

keis·2019년 12월 6일

JavaScript

목록 보기
7/8

프로그램이 실행되는 동안 문제가 발생할 때 대처할 수 있게 처리하는 것
예외(Exception) : 프로그램 실행 중 발생하는 오류
에러(Error) : 프로그래밍 언어의 문법적인 오류
기본 예외 처리, 고급 예외처리 두 가지 방법으로 처리

기본 에러 타입

  • EvalError
    * 전역함수 eval()에 의하여 발생하는 에러 인스턴스를 생성한다.
  • InternalError
    * 자바스크립트 엔진 안에서 내부 에러가 발생했을 때 이에 해당하는 에러 인스턴스를 생성한다(예: 너무 많은 재귀호출)
  • RangeError
    * 숫자 변수나 파라미터가 유효한 범위를 벗어났을 때 발생하는 에러 인스턴스를 생성한다.
  • ReferenceError
    * 잘못된 참조를 했을 때 발생하는 에러 인스턴스를 생성한다.
  • SyntaxError
    * eval() 함수로 코드를 해석하는 중에 발생하는 문법 에러 인스턴스를 생성한다.
  • TypeError
    * 변수나 파라미터가 적절한 타입이 아닐때 발생하는 에러 인스턴스를 생성한다.
  • URIError
    * encodeURI()나 decodeURl() 함수에 부적절한 파라미터가 넘겨졌을 때 발생하는 에러 인스턴스를 생성한다.

throw 문

//throw 문은 예외를 강제로 발생시킬 때 사용한다.
  
throw "Error2"; // generates an exception with a string value
throw 42;       // generates an exception with the value 42
throw true;     // generates an exception with the value true
//사용자 정의 에러
function MyError(message) {
    this.name = "MyError";
    this.message = message || "Default Message";
}
  
MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
  
try {
    throw new MyError();
} catch(e) {
    console.log(e.name);    // "MyError"
    console.log(e.message); // "Default Message"
}
  
try {
    throw new MyError("custom message");
} catch(e) {
    console.log(e.name); //"MyError"
    console.log(e.message); //"custom message"
}

with statement

var obj = {prop: 'foo'};
with (obj) {
    prop = 'bar';
}
console.log(obj.prop); // 'bar'

strict mode에서는 사용할 수 없게됨 (deprecated):

  • with block 안에서는 lexical scope의 상태를 예측할 수 없기 때문에 정적분석이 불가능하고
  • 성능 이슈가 존재하기 때문
//with 문의 모호성
   
function doSomething(value, obj) {
    with(obj) {
        value = "whitch scope in this?";
        console.log(value);
    }
}

label

javascript에는 goto statement가 없습니다.
하지만 goto statement가 가진 장점만(중첩 루프의 쉬운 탈출) 따 온 labeled break, labeled continue 문법을 지원합니다:

outer: for (var i = 0; i < 5; ++i) {
    inner: for (var j = 0; j < 5; ++j) {
        console.log(i , j);
        if (i === 2 && j === 3) {
            break outer;
        }
    }
}
  
// labeled break가 없다면?
var flag = false;
for (var i = 0; i < 5; ++i) {
    for (var j = 0; j < 5; ++j) {
        console.log(i , j);
        if (i === 2 && j === 3) {
            flag = true;
            break;
        }
    }
    if (flag) {
        break;
    }
}

0개의 댓글