if / else 구문으로 예외 처리를 하면 에러가 발생한 객체에 대해서 수명이 유지되기 때문에 에러를 처리하는 동안에도 에러가 발생한 객체를 참조하는 코드가 컴파일 된다.
또한 코드가 중첩될수록 가독성이 떨어진다.
하지만 try / catch는 블럭으로 처리되면서 try 안의 모든 객체는 스코프를 벗어나 참조할 수 없게되므로 훨씬 안전한 코드를 작성할 수 있다.
async & await에서 예외를 처리하는 방법 try, catch를 이용하는 것이다.
프로미스에서 .catch()를 사용했던 것을 async에서는 catch {} 로 사용하면 된다.
async function logTodoTitle() {
try {
const user = await fetchUser();
if (user.id === 1) {
const todo = await fetchTodo();
console.log(todo.title); // delectus aut autem
}
} catch (error) {
console.log(error);
}
}
try {
/*
- 정상 작동하는 코드 블럭
- 경우에 따라 에러(예외)가 발생한다. 예외를 사용할 때, throw를 사용한다.
- throw는 사용자 정의 예외를 던질 수 있다.
- 예외는 throw 문에 의해 직접적으로 발생할 수도 있고, 예외를 발생시키는 메서드의 호출에 의해 발생할 수도 있다.
*/
} catch (e) {
/*
- 이 블럭의 에러는 오직 try 문에서 에러가 발생했을 때 실행된다.
- catch 블록은 throw문장에 의해 명시된 값을 가지고 있는 식별자를 명시한다.
이 식별자를 발생된 예외에 대한 정보를 얻기 위하여 사용할 수 있다.
자바스크립트는 catch 블록에 진입했을때 식별자를 생성하고, 식별자는 catch 블록에 있는 동안만 유지된다.
catch 블록의 시행이 끝난 후, 식별자는 더이상 사용하실 수 없다.
*/
} finally {
/*
- try 블록과 catch 블록이 시행되고, try...catch 문법 다음 문장이 시행되기 전에 시행되는 문장들을 포함한다.
*/
}