-
2023 - 06 - 14 에러핸들링 (Error Handling) try catch, throw, finallyToday I Learned/TIL 06 2023. 6. 14. 01:11
오늘 할일
5주차 강의 듣기
오늘 배운 것
에러 핸들링
에러핸들링
(1) try~catch문 : 에러가 발생했을때
예를들어, users에 있는 이름을 String.toUppercase()를 이용해
대문자로 변경할 때 문자열(String)이 아닌, 데이터 (숫자 2)
가 들어온다면 에러가 발생한다.const users = ["Lee", "Kim", "Park", 2] try { for (const user of users){ console.log(user.toUpperCase()); } } catch (err) { console.error(`Error: $(err.message)`); } // LEE // KIM // PARK // Error: user.toUpperCase is not a function
try문 안에서 발생한 에러는 자동으로 catch문으로 간다.
1. users라는 변수, 즉 배열안에 있는 데이터들을 for문으로 돌면서 안에있는 데이터들을 user라는 변수에 할당한다. toUpperCase()로 대문자열화 할 때 숫자열인 12는 적용이 안된다.
즉 Numbers 숫자열에는 toUpperCase라는 매서드가 존재하지 않기 때문에 에러가 발생한다.
에러가 발생했으므로 catch문으로 간다. 에러메시지 출력. err에는 실제로 발생한 에러의 객체가 들어간다. (문제가 발생한 요소만 들어간다.)
LEE, KIM, PARK, Error: user.toUpperCase is not a function
(2) throw문
프로그래머는 에러를 고의로 발생시키기도 한다. 예를들어 은행 어플의 현금인출 서비스를 만들 때
계좌잔고가 요청받은 금액보다 적을 경우 현금 인출을 막고 인위적으로 예외를 발생시킬 수 있다. 이럴때 throw 사용함.
throw를 호출하면 즉시 현재 실행되고 있는 함수는 실행을 멈추게 된다.
Error가 발생하고, try, catch문으로 에러를 감싸지 않았을 경우에는, 즉 에러핸들링을 하지 않았을 때에는, 서비스 자체가 종료됨. 피해가 더 막심해짐.amount : 출금액, account : 통장잔고 function withdraw (amount, account){ if (amount > account.balance) throw new Error ('잔고가 부족합니다.') // 에러 발생시킴 (error객체 발생시킴) account.balance -= amount; console.log(`현재 잔고가 ${account.balance}남았습니다.`) //출력되지 않음 } const account = {balance: 1000}; withdraw(2000, account) // Error: '잔고가 부족합니다.'
출금금액 : 2000, 통장잔고 : 1000. -> throw new Error ('잔고가 부족합니다.') 에러 객체를 발생시킴
빼기연산자 => account.balance -= amount; account에서 amount만큼 빼고 남은 양
Error: 잔고가 부족합니다.
이 함수에서는 try~catch가 존재하지 않기 때문에 서비스가 종료됨.
(3) 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); 매개변수 파라미터 isThrow가 false로 전달되면, 에러가 발생하지 않음. catch문을 거치지 않음. // 자원을 할당하였습니다. // 자원을 제거하였습니다. errorException(true); 매개변수 파라미터 isThrow가 true로 전달되면, 에러가 발생함. // 자원을 할당하였습니다. // 에러가 발생하였습니다. // 자원을 제거하였습니다.
'Today I Learned > TIL 06' 카테고리의 다른 글