try …catch
try ...catch
문은 실행할 코드블럭을 표시하고 예외(exception) 가 발생(throw)할 경우의 응답을 지정한다.
1
2
3
4
5
6
try {
nonExistentFunction();
} catch (error) {
console.error(error);
// Note- 에러메시지는 브라우저에 따라 다양하다.
}
문법
1
2
3
4
5
6
7
8
9
try {
try_statements
}
[catch (exception_var) {
catch_statements
}]
[finally {
finally_statements
}]
try_ statements
- 실행될 선언들
catch_statements
- try 블록에서 예외가 발생했을 때 실행될 선언들
excetion_var
- catch 블록과 관련된 예외 객체를 담기위한 식별자
finally_statements
- try 선언이 완료된 이후에 실행된 선언들. 이 선언들은 예외 발생 여부와 상관없이 실행된다.
설명
try 선언에는 세 가지 형식이 존재한다.
try ...catch
try ...finally
try ... catch ...finally
catch
블록은 try
블록 안에서 예외가 발생(throw)하는 경우 무엇을 할지 명시하는 코드를 포함한다. try
블록 (또는 try
블록 내에서 호출된 함수) 내의 명령문이 예외를 throw 하면 제어가 catch
블록으로 이동한다. try
블록에 예외가 발생하지 않으면 catch
블록을 건너뛴다.
finally
블록은 try
블록과 catch
블록이 실행을 마친 후 항상 실행된다. 예외가 발생했는지에 관계없이 항상 실행된다.
하나 이상의 try
문을 중첩할 수 있다. 내부의 try
문에 catch
블록이 없으면, 둘러싼 try
문의 catch
블록이 입력된다.
다음의 예시를 통해 알아보자.
무조건적 catch
문
1
2
3
4
5
6
try {
throw "myException"; // exception 을 생성
} catch (e) {
// statements to handle any exceptions
logMyErrors(e); // pass exception object to error handler
} // 예외를 에러핸들러에게 전달한다.
조건적 catch
문
1
2
3
4
5
6
7
8
9
10
try {
myroutine(); // 세가지 예외타입을 던질 수 있다.
} catch (e) {
if (e instanceof TypeError) {
// statements to handle TypeError exceptions
// 타입에러 예외를 처리하기 위한 statements
} else if ( e instanceof RangeError) {
// statements to handle RangeError exceptions
// 범위 에러 예외처리위한 statements
... 와 같이 catch문 안에서 여러가지 상황을 처리할 수 있다.
Examples
Nested try-blocks
1
2
3
4
5
6
7
8
9
10
11
12
13
try {
try {
throw new Error("oops");
} finally {
console.log("finally");
}
} catch (ex) {
console.error("outer", ex.message);
}
// Output:
// "finally"
// "outer" "oops"
- 안쪽 try 문에서 에러를 던졌다.
throw
또는new Error()
와 같은 메서드는 try 블록에서 같은 위치에 존재하는 catch 블록으로 이동시킨다. - 안쪽에서는 catch 블록이 없으므로 바깥 catch 블록으로 이동한다.
- 그전에 finally 블록이 실행되어 위와같은 결과가 나온다.
catch 문에서 에러를 던지면 어떨까..?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
try {
throw new Error("oops");
} catch (ex) {
console.error("inner", ex.message);
throw ex;
} finally {
console.log("finally");
}
} catch (ex) {
console.error("outer", ex.message);
}
// Output:
// "inner" "oops"
// "finally"
// "outer" "oops"
- try 문에서 에러를 던진다.
- catch 블록에서 error 를 받았고, 다시 ex 를 throw 했다.
- finally 는 언제나 실행되기 때문에 , ‘finally’ 가 출력됨.
- 내부 catch 블록에서 ex 를 throw 했기 때문에, 외부 catch 블록이 출력된다.
참조
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/try…catch