예외처리란?
- 예외를 처리하는 방법, 특정 문 실행시 에러가 발생한다면 나머지 코드를 계속 실행하는 것은 의미가 없음
- 그래서 이러한 예외를 처리해서 우회하는 방법이나 다양하게 처리를 하는 것, 사용자에게 예외 사항을 알려주는 경우도 포함
try-catch
- 기본적으로 에러를 다룰 때 try-catch 구문으로 다룸
- try 구문에서 발생한 에러는 catch에서 error 객체로 들어가 catch 구문이 실행이 됨
- 이 error 객체에 다양한 에러 관련 값들이 있기에 이를 잘 처리해 에러 처리를 할 수 있음
try {
X();
} catch (e) {
console.error(e);
console.error('에러 발생');
} finally {
}
에러 - 던지기
- 사용자 & 개발자를 위해서 일부러 에러를 던져서 알려줄 수 있음
- 아래와 같이 에러를 던져서 처리할 수 있음
- 사이트가 다운되거나 알 수 없는 에러 등 사용자에게 안내해서 잘 처리할 수 있음
function login(id, pw) {
if (id === 'zero' && pw === 0000) {
return true;
}
throw new Error('로그인 실패')
}
try {
login('one', 111)
} catch (error) {
console.error(error);
console.error('에러 발생');
window.alert(error);
} finally {
console.log('로그인 시도 시간 : ' + new Date());
}
스택 - 추적
- 에러는 스택 형태로 쌓여서 기록이 됨,
e.stack
을 통해서 에러의 스택을 확인할 수 있음
- 어디서부터 어디가 문제가 있는지 그 기록을 확인가능함, 어디서 잘못되고 처리해야하는지 스택 형태로 추적해서 확인가능함
function x() {
c();
v();
b();
x();
x();
x();
}
try {
x();
} catch (e) {
console.error(e.stack);
}
- 로그를 보게 되면 스택 기록임을 알면 됨(에러에 대해서)
커스텀 - 에러
- 에러 객체는 메시지, 스택 꽤 여러가지 다룰 수 있는게 많음
- 좀 더 구체적인 에러처리를 위해서 에러 객체를 확장해서 직접 커스텀한 에러를 만들 수 있음
- 그리고 에러 객체를 구분해서 좀 더 디테일하게 처리할 수도 있음
class LoginError extends Error {
constructor(message) {
super(message);
this.name = 'Login Error';
}
}
class SomeError extends LoginError {
}
function login(id, pw) {
if (id !== 'a') {
throw new LoginError('아이디 불일치')
}
if (id === 'a' && password === 'a') {
return true;
}
throw new Error('로그인 실패');
}
try {
login('ac', 'a');
} catch (e) {
console.error(e);
if (e instanceof LoginError) {
console.error('로그인 에러가 발생했습니다');
} else {
console.error('에러가 발생했습니다.');
}
} finally {
console.log('로그인 시도 시간 : ' + new Date());
}
- 커스텀 에러 객체를 기존의 에러 객체에서 확장해서 만들 수 있음
- 더 견고하게 에러 처리를 하다보면 직접 만들어서 처리할 수 있음, 또한 커스텀 에러를 더 확장해서 만들 수도 있음