Error
에러는 언제나 코드 곳곳에 도사리고 있다. 에러가 발생하지 않는 코드를 작성하는 것은 불가능하기에, 발생한 또는 발생할 에러에 대응하는 코드를 함께 작성해줘야 한다.
console.log('시작');
foo();
// ReferenceError: foo is not defined
// 강제 종료
console.log('끝'); // 에러로 프로그램이 강제 종료되어 이 코드는 실행되지 않는다.
1. try catch
try ..catch (..finally) 문을 사용하여 프로그램이 강제 종료되지 않게 하고 코드를 실행시킬 수 있다.
try {
console.log('시작');
// 실행할 코드(에러 발생 여지가 있는 코드)
//(1***1); // SyntaxError: Invalid or unexpected token
//foo(); // ReferenceError: foo is not defined
//null.foo; // TypeError: Cannot read property 'foo' of null
//new Array(-1); // RangeError: Invalid array length
//decodeURIComponent('%'); // URIError: URI malformed
} catch (err) {
// try 블록에서 에러가 발생하면 이 블록의 코드가 실행
// 매개변수(이름 자유)에는 try 코드 블록에서 발생한 Error 객체가 전달된다.
console.error(`에러 발생 : ${err}`);
} finally {
// 에러 발생과 상관없이 try catch가 완료되면 finally 블록이 실행된다.
console.log('끝');
}
2. Error 객체
에러 객체를 생성하는 함수도 있다. 이 함수에는 에러를 설명하는 여러 메세지를 인수로 전달할 수 있다. 에러 객체는 name_에러 객체의 이름 / message_에러 생성자 함수 호출 시 인수로 전달한 메세지 / stack_에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열 / 이 3가지의 프로퍼티를 갖는다.
생성자 함수 | 인스턴스 |
Error | 일반적 에러 객체 |
SyntaxError | 자바스크립트 문법에 맞지 않는 문을 해석할 때 |
ReferenceError | 참조할 수 없는 식별자를 참조했을 때 |
TypeError | 피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 |
RangeError | 숫자값의 허용 범위를 벗어났을 때 |
URIError | encodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때 |
EvalError | eval 함수에서 발생 |
3. throw
에러 객체를 만들고 throw를 통해 에러 객체를 던져야 에러가 발생한다. 에러 객체 자체가 에러 발생을 의미하는 것은 아니다.
try {
new Error("에러 발생?");
} catch (error) {
console.log(error);
}
위와 같이 작성하면 콘솔창에 아무것도 뜨지 않는다. try문 안에 throw문을 작성해 주어야 한다.
try {
throw new Error("에러 발생?");
} catch (error) {
console.log(error);
}
//output: Error: 에러 발생?
4. 에러의 전파
에러는 호출자 방향으로 전파되는 특성을 가지고 있다. 실행 중인 실행 컨텍스트가 푸시되기 직전에 푸시된 실행 컨텍스트 방향으로 전파된다는 것이다. 어떤 코드 블록 안에서 발생하여 throw 된 에러를 catch 문에서 잡지 못하게 되면 에러가 코드 블록을 타고 올라가 프로그램이 원하는 대로 동작하지 않게 된다.
const foo1 = () => {
throw Error("1에서 발생한 에러");
};
const foo2 = () => {
foo1();
};
const foo3 = () => {
foo2();
};
try {
foo3();
} catch (error) {
console.log(error); //output: Error: 1에서 발생한 에러
}
try문에서 foo3을 호출 > foo3이 foo2를 호출 > foo2가 foo1를 호출한다. 이때 에러는 호출자 방향으로 전파되므로 foo1의 에러 객체가 foo2 > foo3 > 전역으로 전파되는 것이다.
출처: 모던 자바스크립트 Deep Dive
'[JavaScript]' 카테고리의 다른 글
[javascript] Promise (0) | 2022.10.25 |
---|---|
[javascript] Ajax (0) | 2022.10.25 |
[javascript] ES6 최신 문법 4 _ 구조 분해 할당 Destructuring assignment & 단축 평가 Short-circuit evaluation (2) | 2022.10.13 |
[javascript] ES6 최신 문법 3 _ spread (0) | 2022.10.12 |
[javascript] ES6 최신 문법 2 _ Iteration protocol (0) | 2022.10.12 |
댓글