안녕하세요! 코딩하는 경제학도 쏘코입니다!

 

인터넷을 하다보면 수많은 에러와 마주하게 됩니다.

런타임 에러, 404 에러, 502 에러 등등...

개발자라면 이렇게 오류가 발생했을 때 도망갈 구멍을 미리 만들어 두어야 합니다.

그렇지 않으면 이용자들은 영문도 모르고 "왜 안되지..?"를 외칠 것입니다.

 

오늘 살펴볼 내용은 에러를 다루는 방법입니다.

바로 살펴보시죠!

 

목차


    0. 에러 확인

    나눗셈을 하는 프로그램을 만든다고 생각해봅시다.

    일반적으로 숫자 2개가 들어오면 정상적으로 계산이 됩니다.

    하지만 나누는 수로 0이 들어온다면?

    이상한 사람들이 문자를 넣어버린다면?

    당연히 정상적인 계산이 되지 않기 때문에 오류가 발생하겠죠?

     

    예외처리(Error Handling), 혹은 에러 핸들링프로그램 실행 중 일어나는 비정상적인 상황을 처리하는 것을 뜻합니다.

    이런 상황에 대비하기 위해 C++의 기본 함수들은 미리미리 빠져나갈 구멍을 만들어 놓았죠.

     

    배열이나 벡터에서 []을 사용하여 요소를 불러왔습니다.

    그렇다면 [] 안에 유효하지 않은 인덱스를 넣는다면 어떻게 될까요?

    실행 후에 오류를 뿜뿜하게 됩니다. (잘 돌아가다가 중간부터 에러를 뿜어버림!!)

     

    여기서 at을 사용하면, 범위를 미리 체크하고 범위를 벗어나면 예외임을 알려줍니다. (컴파일이 정상적으로 작동하지 않습니다.)

    코드 관리에 있어서 훨씬 도움이 되겠죠?

    속도는 조금 느리지만, 확실한 에러처리를 위해서는 at을 사용합니다.

     


    1. 에러 처리

    위에서 범위 안에 없는 예외임을 알려주는 에러가 발생했다는 것을 알게 되었죠?

    그렇다면 에러가 발생했을 때 어떻게 동작할 지도 컴퓨터에게 알려줘야 합니다.

     

    if문을 통해서 예외를 처리할 수도 있지만, if문은 예외처리 뿐만 아닌 프로그램의 작동에 있어서도 중요한 역할을 하기 때문에 가독성이 굉장히 떨어집니다.

     

    그래서 등장한 것이 바로 try/catch입니다.

    try { } 블록은 예외 발생에 대한 검사의 범위를 지정할 때 사용됩니다.

    catch (처리할 오류) { } 블록은 try 블록에서 발생한 예외를 처리하는 코드가 담긴 영역입니다.

     

    아래 예시를 보면, at(input)을 통해 3이라는 존재하지 않는 index를 받았을 때

    catch구문에서 에러를 받아서 어떤 에러인지를 출력했습니다.

     

    만약 에러 대신 특정한 타입의 요소를 catch로 넘겨주고 싶다throw를 사용할 수 있습니다.

    특정 조건에서 throw문이 발생하면 throw 다음에 위치한 요소가 catch 블록으로 전달됩니다.

    이를 위해서는 catch의 매개변수가 throw로 넘겨주는 요소와 같은 타입이어야 합니다.

    그렇지 않으면 정상적으로 전달되지 않고 terminate 함수가 호출되어 프로그램이 종료됩니다.

     

    아래 예시에서는 catch에서 double타입의 e를 받습니다.

    n2로 0을 받으면 throw로 n2 = 0을 던져주면 그 값이 e에 저장되고, e가 출력되는 것이죠!

     

    클래스에서도 throw문을 통해 에러를 처리할 수 있습니다.

    똑같은 방식으로 0을 매개변수로 받으면 그대로 0을 catch 블록에 던져주고, 그 값을 Error와 함께 출력합니다.

     

    에러가 한 종류만 있는 것은 아닙니다.

    나눗셈 프로그램에서는 0으로 나누는 에러가 있을 수도 있고, 문자가 들어왔을 때 생기는 에러가 있을 수도 있습니다.

    그렇기 때문에 각각의 에러에 대처하기 위해서 각 에러 별로 catch 블록을 여러 개 설정할 수 있습니다.

     

    에러 클래스를 따로 만들고 상속받아서 에러별로 처리를 할 수 있습니다.

     

    아니면 이미 존재하는 에러별로 처리를 할 수도 있겠죠?!

     


    드디어.. 완강입니다!!! 👍

     

    이 포스팅을 마지막으로 객체지향프로그래밍 수업의 모든 내용을 정리했습니다.

    너무 어려운 부분이기 때문에 간략하게 설명한 부분도 있고,

    추가적인 설명이 필요해서 인터넷을 뒤져가면서 자료를 찾아보기도 했습니다.

    나름 최대한 쉽게, 열심히 설명하려고 노력했는데 그 마음이 닿았다면 좋겠습니다 ㅎㅎ

     

    그렇다면 다른 카테고리에서 더 유익한 포스팅으로 뵙도록 하겠습니다! 😄

    오늘도 읽어주셔서 감사합니다 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기