티스토리 뷰
'try..catch'와 에러 핸들링
'try..catch' 문법
왜 사용하는가?
스크립트가 죽는 걸 방지하고 에러를 잡아서 더 합당한 무언가를 할 수 있다
try {
// 코드...
} catch (err) {
// 에러 핸들링
}
'try' 'catch'라는 두개의 주요블록으로 구성됨
먼저 try{..}안 코드실행
에러가 없다면 try안의 마지막줄까지 실행 catch블록은 건너뜀
에러가 있다면 try안 코드 실행중단되고 catch(err)블록으로 제어흐름 넘어감
변수err(아무이름이나 사용가능)는 무슨일 일어났는지에 대한 설명이 담긴 에러객체 포함
try..catch는 오진 런타임 에러에만 동작한다 !
try..catch는 동기적으로 동작한다 (setTimeout 처럼 스케줄 된 코드에서 발생한 예외는 잡아낼수없다)
에러객체
에러가 발생하면 자바스크립트는 에러 상세내용이 담긴 객체 생성함
그 후 catch블록에 이 객체를 인수로 전달
try {
// ...
} catch(err) { // <-- '에러 객체', err 대신 다른 이름으로도 쓸 수 있음
// ...
}
내장 에러 전체와 에러객체는 두가지 주요 프로퍼티를 가짐
name: 에러 이름, 정의되지않은 변수 떄문에 발생한 에러라면 RefernceError가 이름이 됨
message: 에러 상세 내용을 담고있는 문자메세지
stack: 현재 호출 스택 에러를 유발한 중첩 호출들의 순서정보를 가진 문자열로 디버깅 목적으로 사용
(표준은 아니지만 널리 사용되는 비표준 프로퍼티중 하나)
'throw' 연산자
//문법
throw <error object>
throw연산자는 에러를 생성함
이론적으로는 숫자 문자열같은 원시형자료를 포함한 어떤 것이든 에러객체로 사용가능
하지만 내장에러와의 호환을 위해 되도록 에러 객체에 name과 message프로퍼티를 넣어주는 것을 권장
try...catch...finally
finally안의 코드는 다음과 같은 상황에 실행
- 에러가 없는 경우: try 실행이 끝난 후
- 에러가 있는 경우: catch 실행이 끝난 후
try {
... 코드를 실행 ...
} catch(e) {
... 에러 핸들링 ...
} finally {
... 항상 실행 ...
}
finally를 사용하면 try..catch를 다음과 같이 확장할 수 있음
커스텀 에러와 에러 확장
에러 확장하기