Error handling
- 에러 핸들링은 에러를 관리하는 방법이고, 예상치 못한 상황에 대처하는 방식입니다.
- 에러는 예상할 수 있는 에러와 예상치 못한 에러로 구분할 수 있는데, 일반적인 어플리케이션을 설계할 때에는 예상치 못한 에러 상황이 더욱 많이 일어날 것으로 가정해야 합니다.
- 프로그래머가 작성한 코드에서 예상치 못한 에러가 일어날 가능성은 언제나 존재하고, 이러한 에러 상황을 대비해 언제든지 처리할 수 있어야 합니다.
try / catch
- 서버에서 에러가 발생하지 않게 하기 위해서 저희는 예외 처리를 진행합니다.
- 예외 처리는 일반적으로 try … catch 문을 사용합니다.이렇게 예상치 못한 에러에 대처하기 위해선 try … catch문으로 코드 전체를 감쌀 수 있습니다.
- users에 들어있는 이름들을 String.toUpperCase()를 이용하여 대문자로 변경하려할 때 **문자열(String)**이 아닌 데이터가 들어온다면 에러가 발생합니다.
- 에러가 발생하더라도 프로그램이 멈추지 않고 에러를 기록할 수 있습니다.
// toUpperCase() 소문자를 대문자로 바꿔주는 메소드
try를 싱행하다가 오류가 나게되면 catch(err) err에 오류 객체가 담기게 되고 err.message로 에러 메세지에 접근할 수 있습니다
const users = ["Lee", "Kim", "Park", 2];
try {
for (const user of users) {
console.log(user.toUpperCase());
}
} catch (err) {
console.error(`Error: ${err.message}`);
}
// Print : Lee
// KIM
// PARK
// Error : user.toUpperCase is not a function
throw
위에서 에러를 핸들링하는 과정만 공부하였다면, 에러는 무조건 차단하고 발생시키면 안되는 걸까요?
아닙니다. 프로그래머의 입장에서 에러는 고의로 에러를 발생시키기도 해야합니다.
예를 들어서 은행 어플리케이션의 현금 인출 서비스를 만든다고 할 때, 계좌의 잔고가 요청받은 금액보다 적다면 현금 인출을 막고 예외를 발생시켜야겠죠? 이럴때 사용하는 것이 throw입니다.
throw를 호출하면 그 즉시 현재 실행되고 있는 함수는 실행을 멈추게 됩니다.
function withdraw(amount, account) {
if (amount > account.balance)
throw new Error("잔고가 부족합니다.");
account.balance -= amount;
console.log(`현재 잔고가 ${account.balance}남았습니다.`); // 출력되지 않음
}
const account = {balance: 1000};
withdraw(2000, account);
//Print : Error : 잔고가 부족합니다
finally
try 에서는 HTTP연결이 되고 있거나 파일과 같은 특정한 ‘자원’을 가지고 처리할 때가 있습니다. 하지만 해당 ‘자원'을 계속 가지고 있으면, 무의미한 메모리를 차지하게 될 것 이므로 에러 여부와 상관없이 일정 시점에서는 해당 ‘자원'을 삭제 시켜야합니다.
그렇다면 이 ‘자원'을 삭제하는 시점은 언제가 되어야 할까요? 에러가 언제든지 발생할 수 있는 try? 아니면 에러가 일어났을 때 실행되는 catch? 이런 상황에서는 finally가 필요합니다.
finally는 에러가 발생했는지 여부와 상관없이 언제든지 실행됩니다.
function errorException(isThrow) {
try {
console.log('자원을 할당하였습니다.');
if (isThrow) throw new Error();
} catch (error) {
console.log('에러가 발생했습니다.');
} finally {
console.log('자원을 제거하였습니다.');
}
}
errorException(false);
// 자원을 할당하였습니다.
// 자원을 제거하였습니다.
errorException(true);
// 자원을 할당하였습니다.
// 에러가 발생했습니다.
// 자원을 제거하였습니다.
'JavaScript&TypeScript' 카테고리의 다른 글
JavaScript Array 자주 쓰이는 내장함수 복습하기 (0) | 2022.12.16 |
---|---|
JavaScript 클래스를 알아보자 class (0) | 2022.12.12 |
Javascript 동기(Sync)&비동기(Async) (0) | 2022.12.12 |
JavaScript 고급 함수 forEach() (1) | 2022.12.10 |
JavaScript 클래스와 객체 함수의 차이? (0) | 2022.11.22 |
댓글