[learning javascript] chapter 11. 예외와 에러 처리

예외와 에러 처리

Error 객체

const validateEmail = validateEmail(email); if(validateEmail instanceof Error) { console.error(Error: ${validatedEmail.message}); } else { console.log(Valid Email: ${validatedEmail}); }

- 이 방법도 Error 인스턴스를 활용하고 유용한 방법이지만 예외 처리에 더 자주 사용됨

## try/catch와 예외 처리
- 예외 처리는 try...catch문을 사용
```javascript
const email = null;

try {
    const validatedEmail = validateEmail(email);
    if(validatedEmail instanceof Error) {
        console.error(`Error: ${validatedEmail.message}`);
    } else {
        console.log(`Valid email: ${validatedEmail}`);
    }
} catch(err) {
    console.error(`Error: ${err.message}`);
}

에러 일으키기

예외 처리와 호출 스택

try { a(); } catch(err) { console.log(err.stack); }

try { d(); } catch(err) { console.log(err.stack); }

- 결과

a: calling b b: calling c c: throwing error c@debugger eval code:13:1 b@debugger eval code:8:4 a@debugger eval code:3:4 @debugger eval code:23:4

d: calling c c: throwing error c@debugger eval code:13:1 d@debugger eval code:18:4 @debugger eval code:29:4

- @기호가 있는 행은 스택 추적이며 `가장 깊은`함수(c)에서 시작하고 함수가 남지 않았을 때 끝남

## try...catch...finally
- try 블록의 코드가 HTTP 연결과 같은 일종의 `자원`을 처리할 때 에러가 있든 없든 자원을 해제 해야할 경우가 있음
- 이런 상황에서 finally 블록을 사용. finally블록은 에러가 발생해도 실행
```javascript
try {
    console.log("this line is executed...");
    throw new  Error("whoops");
    console.log("this line is not...");
} catch(err) {
    console.log("threr was an error...");
} finally {
    console.log("...always executed");
    console.log("perform cleanup here");
}