ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 - 06 - 14 에러핸들링 (Error Handling) try catch, throw, finally
    Today 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로 전달되면, 에러가 발생함.
     
     // 자원을 할당하였습니다.
     // 에러가 발생하였습니다.
     // 자원을 제거하였습니다.

     

    댓글

Designed by Tistory.