- [47.1] 에러 처리의 필요성
- try ... catch 문을 사용해 발생한 에러에 적절하게 대응하면 프로그램이 강제 종료되지 않고 계속해서 코드를 실행시킬 수 있다.
- console.log('[Start]');
try {
foo( );
} catch (error) {
console.error('[에러 발생]', error);
// [에러 발생] ReferenceError: foo is not defined
}
// 발생한 에러에 적절한 대응을 하면 프로그램이 강제 종료되지 않는다.
console.log('[End]');
- console.log('[Start]');
- [47.2] try ... catch ... finally 문
- try ... catch ... finally 문은 다음과 같이 3개의 코드 블록으로 구성된다.
- finally 문은 불필요하다면 생략 가능하다.
- catch 문도 생략 가능하지만 catch 문이 없는 try 문은 의미가 없으므로 생략하지 않는다.
- try {
// 실행할 코드(에러가 발생할 가능성이 있는 코드)
} catch(err) {
// try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행된다.
// err에는 try 코드 블록에서 발생한 Error 객체가 전달된다.
} finally {
// 에러 발생과 상관없이 반드시 한 번 실행된다.
}
- try {
- try ... catch ... finally 문을 실행하면 먼저 try 코드 블록이 실행된다.
- 이때 try 코드 블록에 포함된 문 중에서 에러가 발생하면 발생한 에러는 catch 문의 err 변수에 전달되고 catch 코드 블록이 실행된다.
- catch문의 err 변수는 try 코드 블록에 포함된 문 중에서 에러가 발생하면 생성되고 catch 코드 블록에서만 유효하다.
- finally 코드 블록은 에러 발생과 상관없이 반드시 한 번 실행된다.
- [47.3] Error 객체
- Error 생성자 함수에는 에러를 상세히 설명하는 에러 메세지를 인수로 전달할 수 있다.
- const error = new Error('invalid');
- Error 생성자 함수가 생성한 에러 객체는 message 프로퍼티와 stack 프로퍼티를 갖는다.
- message 프로퍼티의 값은 Error 생성자 함수에 인수로 전달한 에러 메세지이고, stack 프로퍼티의 값은 에러를 발생시킨 콜스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용한다.
- [47.4] throw 문
- Error 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다.
- 즉, 에러 객체 생성과 에러 발생은 의미가 다르다.
- 에러를 발생ㅅ기키려면 try 코드 블록에서 throw 문으로 에러 객체를 던져야 한다.
- throw 표현식;
- throw 문의 표현식은 어떤 값이라도 상관없지만 일반적으로 에러 객체를 지정한다.
- 에러를 던지면 catch 문의 에러 변수가 생성되고 던져진 에러 객체가 할당된다.
- 그리고 catch 코드 블록이 실행되기 시작한다.
- try{
// 에러 객체를 던지면 catch 코드 블록이 실행되기 시작한다.
throw new Error('something wrong');
} catch(error) {
console.log(error);
}
- try{
- [47.5] 에러의 전파
- thow된 에러를 캐치하지 않으면 호출자 방향으로 전파된다.
- throw된 에러를 어디에서도 캐치하지 않으면 프로그램은 강제 종료된다.
- 주의할 것은 비동기 함수인 setTimeout이나 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다는 것이다.
- 따라서 에러를 전파할 호출자가 존재하지 않는다.
'[자바스크립트]' 카테고리의 다른 글
[JavaScript/DeepDive]48.모듈 (0) | 2021.07.02 |
---|---|
[JavaScript/DeepDive]46.제너레이터와 async/await (0) | 2021.06.30 |
[JavaScript/DeepDive]45.프로미스 (0) | 2021.06.30 |
[JavaScript/DeepDive]44.REST API (0) | 2021.06.29 |
[JavaScript/DeepDive]43.Ajax (0) | 2021.06.29 |