C++ 自定义异常
1. 引言
在 C++ 中,我们可以使用异常来处理程序中的错误。C++ 提供了一些内置的异常类型,如 std::exception
和其派生类,但有时我们需要自定义异常类型以满足特定的需求。本文将详细介绍如何在 C++ 中自定义异常。
2. C++ 异常处理机制简介
异常处理是一种程序控制流的机制,用于在出现错误时进行处理,以确保程序的正确性和稳定性。在 C++ 中,异常处理机制包括以下几个关键字:
try
:代码块,用于标识可能会引发异常的代码段。catch
:代码块,用于捕获和处理抛出的异常。throw
:用于引发异常的关键字。
下面是异常处理机制的基本语法:
try {
// 可能引发异常的代码
} catch (ExceptionType1 e1) {
// 异常处理代码
} catch (ExceptionType2 e2) {
// 异常处理代码
} catch (...) {
// 捕获所有其他类型的异常
}
3. 自定义异常类
在 C++ 中,我们可以通过自定义异常类来满足特定的需求。自定义异常类应该从标准异常类 std::exception
派生,以符合异常处理机制的要求。
下面是自定义异常类的基本结构:
class MyException : public std::exception {
public:
MyException(const char* message) : std::exception(message) {}
virtual const char* what() const throw() {
return "MyException occurred";
}
};
在上面的代码中,我们定义了一个名为 MyException
的自定义异常类,它继承自 std::exception
。我们在构造函数中接收错误信息,并将其传递给基类 std::exception
。what
函数用于返回异常的字符串描述。
4. 抛出异常
在需要引发异常的地方,我们可以使用 throw
关键字抛出自定义异常。下面是示例代码:
void checkNumber(int number) {
if (number < 0) {
throw MyException("Negative number not allowed");
}
}
在上面的代码中,我们定义了一个名为 checkNumber
的函数,它接收一个整数作为参数。如果参数为负数,则抛出自定义异常 MyException
。
5. 捕获异常
在引发异常之后,我们可以使用 catch
关键字来捕获并处理异常。下面是示例代码:
int main() {
try {
checkNumber(-5);
} catch (MyException& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
在上面的代码中,我们在 main
函数中调用了 checkNumber
函数,并在 try
代码块中捕获了 MyException
异常。如果 checkNumber
函数引发了异常,则该异常将由 catch
代码块中的语句捕获和处理。
示例代码的输出为:
Exception caught: MyException occurred
6. 捕获多个异常类型
在异常处理过程中,我们还可以捕获多个不同类型的异常,并针对每种异常类型编写对应的处理代码。下面是示例代码:
void checkNumber(int number) {
if (number == 0) {
throw MyException("Zero not allowed");
} else if (number < 0) {
throw std::runtime_error("Negative number not allowed");
} else {
std::cout << "Number is valid" << std::endl;
}
}
int main() {
try {
checkNumber(-5);
} catch (MyException& e) {
std::cout << "MyException caught: " << e.what() << std::endl;
} catch (std::exception& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
在上面的代码中,我们重新定义了 checkNumber
函数。如果参数为零,则抛出自定义异常 MyException
,否则,如果参数为负数,则抛出标准异常 std::runtime_error
。
在 main
函数中的 catch
代码块中,我们分别捕获了 MyException
和 std::exception
异常,以便根据实际情况进行处理。示例代码的输出为:
MyException caught: Zero not allowed
7. 总结
本文介绍了如何在 C++ 中自定义异常,并使用异常处理机制来处理程序中的错误。通过自定义异常类,我们可以更好地适应特定的需求。在编写程序时,合理地使用异常处理机制可以提高程序的可维护性和健壮性。