이이프
IeF 제멋대로 세상
이이프
전체 방문자
오늘
어제

공지사항

  • ✔ Info
  • 전체 글보기 (56)
    • 💻프로그래밍 내용 정리 (55)
      • C (0)
      • C++17 (55)
    • 💻게임메이커 (0)
    • 💻언리얼엔진 (0)
    • 💻유니티 (0)
    • 🎈[팀&자작]게임소개 (0)
    • 📃게임제작기술 (0)
    • 🎨그림놀이 (0)
    • 📒대학생활 (0)
    • 😃잡담 (1)
    • 🕹게임성과 (0)
    • 💷자격증 (0)

블로그 메뉴

  • 방명록

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
이이프
💻프로그래밍 내용 정리/C++17

[C++ 1.2.5] 익셉션(exception(예외)), throw 구문, catch/try 구문

[C++ 1.2.5] 익셉션(exception(예외)), throw 구문, catch/try 구문
💻프로그래밍 내용 정리/C++17

[C++ 1.2.5] 익셉션(exception(예외)), throw 구문, catch/try 구문

2022. 8. 16. 21:22
728x90

익셉션(예외)이란?

C++은 유연성이 뛰어난 반면 안전성은 좋지 않다.

메모리 공간을 무작위로 접근하거나 0으로 나누는 연산을 수행하더라도 컴파일러는 가만히 수행한다.

 

이처럼 C++에 안전성을 좀 더 높이기 위해 제공하는 기능 중 하나가 익셉션(예외)이다.

익셉션이란 예상하지 못한 상황을 표현하는 클래스/객체이다.

예상하지 못한 상황에 대처하는 방법은 그 함수에서 nullptr이나 에러 코드와 같은 특수한 값을 리턴하는 것이다.

 

코드에서 특정한 조건을 만족해서 익셉션을 발생시키는 것을 익셉션을 던진다(발생시킨다)고 표현하고,

throw 구문으로 작성한다.

 

또한 이렇게 발생한 익셉션을 대해 적절한 동작을 수행하는 것을 익셉션을 잡는다(받는다, 처리한다)고 표현하고,

catch 구문으로 작성한다.

 

throw 구문

divideNumbers()란 함수를 만들어 익셉션을 던지고 잡는 예를 살펴보자.

이 함수가 전달된 분모의 인수가 0이면 익셉션을 발생시킨다.

std::invalid_argument란 익셉션을 사용했는데, 이러면 <stdexcept> 헤더 파일을 불러와야 한다.

double divideNumbers(double numerator, double denominator)
{
    if (denominator == 0) {
        throw invalid_argument("Denominator cannot be 0.");
    }
    return numerator / denominator;
}

throw 문장이 실행되면 함수에서 값을 리턴하지 않고 실행을 즉시 중단한다.

이처럼 익셉션이 발생하는 함수를 호출할 때는 다음 코드처럼 try/catch 블록으로 감싼다.

그러면 함수에서 익셉션이 발생할 때 적절히 대처할 수 있다.

 

try/catch 구문

다음은 분모가 0일때 익셉션을 발생시키는 코드이다.

#include <iostream>
#include <stdexcept>

using namespace std;

double divideNumbers(double numerator, double denominator)
{
    if (denominator == 0) {
    	throw invalid_argument("Denominator cannot be 0.");
    }
    return numerator / denominator;
}

int main()
{
    // 익셉션 함수 호출
    try {
    	cout << divideNumbers(2.5, 0.5) << endl;
    	cout << divideNumbers(2.3, 0) << endl;
    	cout << divideNumbers(4.5, 2.5) << endl;
    }
    catch (const invalid_argument& exception) {
    	cout << "Exception cauht: " << exception.what() << endl;
    }
    return 0;
}

결과

divideNumbers()를 처음 호출할 때는 정상적으로 실행돼 결과가 화면에 출력된다.

두 번째로 호출할 때는 익셉션이 발생한다.

아무런 값도 리턴되지 않기 때문에 익셉션을 잡았다는 에러 메시지만 화면에 출력된다.

익셉션이 발생해서 프로그램의 실행 흐름이 바로 catch 블록으로 건너뛰었기 때문이다.

세 번째 호출하는 문장은 실행되지 않는다.

 

익셉션을 처리하는 코드를 따로 작성하지 않으면 프로그램 자체에서 처리하는데,

그러면 프로그램이 그냥 종료된다.

'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글

[C++ 1.3.1] 클래스 정의, 접근 수준(public, private), 생성자(생성자 이니셜라이저), 소멸자  (0) 2022.08.17
[C++ 1.2.6] 타입 추론(auto, decltype)  (0) 2022.08.16
[C++ 1.2.4] 레퍼런스, Const 레퍼런스  (0) 2022.08.16
[C++ 1.2.3] Const의 다양한 용도  (0) 2022.08.16
[C++ 1.2.2] 스택과 힙, 포인터와 동적 메모리, 역참조, 배열 포인터, 널 포인터 상수(NULL), 스마트 포인터(unique_ptr, shared_ptr)  (0) 2022.08.16
  • 익셉션(예외)이란?
  • throw 구문
  • try/catch 구문
'💻프로그래밍 내용 정리/C++17' 카테고리의 다른 글
  • [C++ 1.3.1] 클래스 정의, 접근 수준(public, private), 생성자(생성자 이니셜라이저), 소멸자
  • [C++ 1.2.6] 타입 추론(auto, decltype)
  • [C++ 1.2.4] 레퍼런스, Const 레퍼런스
  • [C++ 1.2.3] Const의 다양한 용도
이이프
이이프
게임 프로그래머 지망생 / Since 2022.08.14
IeF 제멋대로 세상게임 프로그래머 지망생 / Since 2022.08.14

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.