에러발생 전 사전처리 및 발생한 에러를 잡아내고 처리하는 모든 과정을 일컫음.
사용자가 서비스를 이용하는 동안 발생할 수 있는 에러를 미리 사전에 예측하여, 이용자의 사용 흐름이 막히지 않도록 유도
예외 상황이나 에러가 발생했을 때, 소프트웨어를 갑자기 종료하는 것보다는 에러가 발생했음을 알리고, 곧 서비스가 정상적으로 구동될 것임을 안내하여 사용자로 하여금 정상화에 대한 믿음을 주고, 이탈을 방지하는 수단으로 사용
발생 배경
[예시] 회원가입 규칙
1. 이메일에는 @가 들어가야 한다.
2. 비밀번호를 10자 이상 지정한다. -> 유저가 5자리만 설정한다면? -> 예외사항 -> 잘못된 방법으로 서비스를 사용하는 것을 막아야 한다.
3. 회원가입 계정은 중복될 수 없다.
컴퓨터 언어 입장에서는 에러가 아니나, 유저가 잘못된 방식으로 서비스를 이용하기 전에 예외 상황을 미리 일으켜 에러를 발생시키고, 클라이언트 개발자에게 에러 상황 에러 코드로 알립니다. 프론트엔드 개발자는 아래 에러를 반환받아 유저에게 적절한 안내 문구를 띄워줍니다.
const { email, password } = req.body
if (!email.includes('@')) {
return new Error('EMAIL_INVALID')
}
if (password.length < 10) {
return new Error('PASSWORD_INVALID')
}
...
잠재적인 에러가 발생할 가능성이 있는 부분에서 에러를 처리하기 위한 구문
try 블록 : 에러가 발생할 가능성이 있는 코드
catch 블록 : 에러가 발생했을 때를 대비한 행동
try 블록에서 어떠한 예외 처리를 위해 에러를 throw하면, 에러가 catch 블록으로 넘어감. 따라서 try 블록 내부에 throw 코드가 있거나, throw 코드를 내장하고 있는 다른 함수를 호출하게 됨
try {
const a = someFunc(); // <-- 함수 실행이 잘못될 확률이 있으므로 try 내부에 존재.
let aDouble = a + a; // <-- 변수 할당이 잘못되어 있을 확률이 있으므로 try 내부에 존재.
let nothing = 1 + 4; // <-- try에 있을 필요가 없음.
} catch {}
catch 블록 내부에서 또다시 에러를 throw 할 수 있는데, 이러한 상황에서는 더 상위 모듈로 에러를 던지게 됨
try {
const { email, password } = req.body
if (!email.includes('@')) {
const error = new Error('EMAIL_INVALID')
error.statusCode = 400
throw error
}
if (password.length < 10) {
const error = new Error('PASSWORD_INVALID')
error.statusCode = 400
throw error
}
...
} catch (err) {
console.log(err) // 어떠한 형태의 에러가 발생하든, 에러를 콘솔에 찍어서 개발자에게 보여줍니다.
return res.json({
}