프로그래밍 공부
작성일
2024. 1. 10. 15:46
작성자
WDmil
728x90

1.2.4 예외처리

 

C++는 유연한 언어이기는 하지만 딱히 안전한 언어는 아니다.

 

작성한 코드가 엉뚱한 메모리 영역을 헤집거나, 0으로 나누기(컴퓨터가 표현 불가)를 시도해도 컴파일러가 걸러주지 않는다.

 

C+의 익셉션(exeption)은 코드의 안정성을 높이기 위해 언어차원에서 제공되는 기능이다.

익셉션 : 예상치 못한 상황

 

웹페이지를 가져오는 함수를 작성할 때, 페이지를 서비스하는 인터넷 호스트가 다운되었을 수도 있고, 페이지가 없어지거나, 연결이 해제되어버릴 수도 있다.

 

많은 프로그래밍 언어에서 함수의 리턴값을 nullptr이나 특별한 에러코드에 매핑하는 방법으로 대응한다.

 

그러나 익셉션은 더 쉽게 처리할 수 있다.

 

익셉션에서는 몇가지 새로운 용어가 도입되었다. 특정 코드가 예외적인 상황을 인지하면 익셉션을 던진다(throw),

그리고 또 다른 코드가 던져진 익셉션을 받아서(catch) 필요한 뒤처리를 한다.

 

#include <stdexcept>

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

 

만약, throw 구문에 이르면 리턴값도 없이 함수실행이 즉시 중지된다. 다음과 같이

호출한측에서 이 함수를 try/catch 블록으로 감쌌다면, 던져진 익셉션을 받아서 뒤처리를 진행한다.

#include <iostream>
#include <exception>
int main()
{
	try {
    	std::cout << divideNumbers(2.5, 0.5) << std::endl;
        std::cout << divideNumbers(2.3, 0) << std::endl;
        std::cout << divideNumbers(4.5, 2.5) << std::endl;
     } catch (const std::exception& exception) {
     	std::cout << "Exception caught: " << exception.wath() << std::endl;
     }
     return 0;
 }

 

divideNumbers() 함수의 첫 호출에서 0으로 나누기가 발생하지 않기에 정상결과를 리턴한다.

그러나, 두번쨰 호출에서 분모에 해당하는 파라미터가 0이기 때문에, 리턴없이 익셉션이 발생하고, catch블록에서 실행을 넘겨받아. 에러메세지를 출력한다.

 

두번째 호출에서 catch블록으로 점프하기 때문에 세번째 호출은 실행하지 않는다.

 

익셉션은 사용하기에 따라 난해하지만, 편리할 수 있다.

 

익셉션을 throw할 때 스텍 변수에 무슨 일이 일어나는지 정확하게 이해하고, 이를 바탕으로 catch 블록에서의 작업을 구상하면 된다.

 

실제 코드에서는 해당 맥락에 맞게 필요한 예외 관련 정보를 텍스트 등으로 자세히 담고있는 예외타입을 정의하는것 이 바람직 하다.

 

 C++컴파일러는 모든 익셉션에 대해 catch구문을 강제하지 않는다. 만약 호출 과정에서 catch블록이 하나도 없다면,

익셉션이 throw될 때, 표준 라이브러리가 받게되고. 프로그램이 아무런 경고없이 종료된다.

 

728x90