HOWTO · C++
C++의 사용자 지정 예외
C++에서 사용자 정의 예외 클래스 구현에 대한 프로그래밍 자습서입니다.
이 간단한 프로그래밍 자습서는 C++에서 사용자 정의 예외 클래스를 구현하고 C++에서 사용자 정의 예외 클래스를 구현하기 위한 기본 규칙에 대해 설명합니다.
C++의 예외 처리
C++에서 예외 처리는 런타임 문제를 처리하는 방법입니다. 런타임 문제가 발생하더라도 애플리케이션의 일반적인 흐름이 유지될 수 있도록 예외를 처리합니다.
C++에서 예외는 런타임 프로세스 중에 throw되는 개체이며 프로그램의 정상적인 실행을 방해합니다.
std::exception 클래스는 모든 예외의 루트입니다. 예외를 처리하지 않으면 애플리케이션은 오류 메시지를 출력하고 종료합니다.
예외를 통해 한 프로그램 영역에서 다른 프로그램 영역으로 제어를 전달할 수 있습니다. 세 개의 키워드 try, catch 및 throw는 C++에서 예외를 처리합니다.
throw- 코드의 세그먼트가 문제를 일으킬 수 있는 경우throw키워드를 사용하여 예외를 발생시키고 발생할 수 있는 예외 유형을 지정합니다.try- 오류를 일으킬 수 있고 예외를 throw해야 하는 코드 세그먼트가 포함되어 있습니다.catch- 예외가 발생했을 때 호출되는 블록입니다. 이 코드 블록에서 사용자에게 오류에 대해 알리고 필요한 경우 프로그램을 프로그래밍 방식으로 종료할 수 있습니다.
예외의 일반적인 예는 런타임에 발생하는 0으로 나누기 오류입니다. 프로그램에서 가장 자주 발생하는 예외입니다.
이 0으로 나누기 런타임 예외가 발생하기 쉬운 다음 코드 스니펫을 살펴보겠습니다.
#include <iostream>
using namespace std;
float divideFunc(int a, int b) {
if (b == 0) {
throw "User made a division with zero!";
}
return (a / b);
}
int main() {
int num1 = 20;
int num2 = 0;
float result = 0;
try {
result = divideFunc(num1, num2);
cout << result << endl;
} catch (const char* msg) {
cout << msg << endl;
}
}
출력:
예외 클래스 계층
예외는 많은 클래스를 하위 클래스로 포함하는 클래스이며 이러한 클래스는 모두 예외 유형입니다. C++에는 프로그램에서 쉽게 사용할 수 있도록 미리 정의된 공통 예외 유형 집합이 있습니다.
C++의 사용자 지정 예외
C++에 지정되지 않은 사용자 지정 예외는 특정 상황에서 생성하는 데 도움이 될 수 있습니다. C++에서는 특정 기준을 충족하는 모든 유형이 catch되거나 throw될 수 있습니다.
여기에는 유효한 복사 생성자와 소멸자가 있는 형식이 포함됩니다.
사용자 정의 예외는 문제에 대한 유용한 정보와 함께 예외 처리 메커니즘을 제공합니다. 필요한 속성을 가진 새 클래스를 만들고 해당 클래스의 인스턴스를 던지거나 std::exception에서 상속하고 what() 함수를 재정의하여 만들 수 있습니다.
프로그램에서 양수 입력을 얻어야 한다고 가정합니다. 음수가 입력되면 예외를 throw할 수 있습니다.
다음과 같이 사용자 정의 예외 클래스를 만들 수 있습니다.
class MyExceptionClass : public exception {
public:
const char* what() const throw() { return "Negative number not allowed\n"; }
};
이것은 다음과 같이 드라이버 프로그램에서 잡을 수 있습니다.
int main() {
try {
int a;
cout << "Enter a number : \n";
cin >> a;
if (a < 0) {
MyExceptionClass c;
throw c;
} else {
cout << "you entered: " << a << endl;
}
} catch (exception& e) {
cout << e.what();
}
}
출력:
위의 코드에서 Exception 클래스를 사용하여 사용자 정의 예외 클래스를 상속했고 예외가 발생했을 때 호출될 what() 메서드를 재정의했음을 알 수 있습니다.