2 분 소요

예외 탐지(try-catch())

런타임 실행중에 예외가 발생하면, try로 예외를 탐지할 수 있으며, 탐지된 예외는 catch()에서 적절한 작업을 할 수 있습니다.

다음 코드에서 func()함수는 print()메서드가 없어 예외를 발생시키는데요, 예외가 발생하면 곧바로 catch()문으로 분기하기 때문에 #1은 실행되지 않습니다.

1
2
3
4
5
6
7
8
9
10
11
12
const func = (obj) => {
    obj.print(); // (x) 예외 발생. print 메서드가 없습니다.
    console.log('func()을 실행했습니다.'); // #1
};

try {
    const myData = {};
    func(myData); // print 메서드가 없어서 예외를 발생시킵니다.
}
catch(e) {
    console.log('예외를 처리합니다.', e);
}

에러 종류

catch()는 발생된 에러가 전달되며 기본적으로 Error클래스를 상속한 다음 클래스들이 제공됩니다.

항목 내용
Error 최상위 클래스
EvalError 문자열로된 코드를 직접 실행하는 eval()함수 오류
RangeError 수치 범위 오류
ReferenceError 존재하지 않은 개체 참조
SyntaxError 문법 오류. 코드 실행 전에 발생
TypeError 잘못된 타입
URIError 잘못된 URI

에러 발생과 전파(throw)

예외 상황일때 직접 예외를 발생시키고 싶으면 throw를 사용하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
const add = (a, b) => {
    if (a < 0 || b < 0) {
        throw new RangeError('a또는 b는 0 이상이어야 합니다.');
    }
    return a + b;
};

try {
    add(-1, -1);
}
catch(e) {
    console.log('예외를 처리합니다.', e);
}

만약 사용자가 정의한 예외를 발생시키고 싶다면, 예외 catch()의 일관성을 위해 Error를 상속해서 재구현 하는게 좋으며, catch()에서 처리할 수 없는 예외라면, 다른 곳에서 처리할 수 있도록 throw로 재전파 하는게 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 예외를 catch()할때 일관성있게 작성할 수 있으므로,
// Error를 상속해서 만드는게 좋습니다. 
class ResultError extends Error {}

const add = (a, b) => {
    if (a < 0 || b < 0) {
        throw new RangeError('a또는 b는 0 이상이어야 합니다.');
    }

    const result = a + b;

    if (result > 10) {
        throw new ResultError('결과값 오류 입니다.');
    }
    return a + b;
};

try {
    add(1, 100);
}
catch(e) {
    if (e instanceof RangeError) {
        console.log('입력값이 잘못되었습니다.');
    }
    else if (e instanceof ResultError) {
        console.log('결과값이 잘못되었습니다.');
    }
    else {
        console.log('처리할 수 없는 예외는 전파합니다.', e);
        throw e; // 예외 전파
    }
}

finally

trycatch()후 반드시 실행되어야 하는 코드가 있으면 finally를 사용할 수 있으며, #1과 같이 return이 있더라도 return전에 finally가 호출됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const func = (error) => {
    if (error) {
        throw new Error();
    }
};

try {
    func(false); // 예외를 발생시키지 않으면, return 전에 finally가 호출됩니다.    
                 // 예외를 발생시키면 catch() 호출뒤 finally가 호출됩니다.
    return; // #1
}
catch(e) {
    console.log('catch하였습니다.', e);
}
finally {
    console.log('finally 입니다.');
}

댓글남기기