推荐答案
在C++中,自定义异常类通常是通过继承标准库中的std::exception类来实现的。以下是一个简单的自定义异常类的示例:
// www.javascriptcn.com code example
#include <exception>
#include <string>
class MyException : public std::exception {
private:
std::string message;
public:
MyException(const std::string& msg) : message(msg) {}
virtual const char* what() const noexcept override {
return message.c_str();
}
};使用示例
// www.javascriptcn.com code example
#include <iostream>
void riskyFunction() {
throw MyException("Something went wrong!");
}
int main() {
try {
riskyFunction();
} catch (const MyException& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}本题详细解读
1. 继承 std::exception
在C++中,标准库提供了std::exception类作为所有标准异常的基类。自定义异常类通常继承自std::exception,以便能够与现有的异常处理机制兼容。
class MyException : public std::exception {
// ...
};2. 重写 what() 方法
std::exception类提供了一个虚函数what(),用于返回异常的描述信息。自定义异常类通常需要重写这个函数,以返回自定义的错误信息。
virtual const char* what() const noexcept override {
return message.c_str();
}3. 异常类的构造函数
自定义异常类通常需要一个构造函数来接收错误信息,并将其存储在类的成员变量中。
MyException(const std::string& msg) : message(msg) {}4. 抛出和捕获自定义异常
自定义异常类可以像标准异常一样被抛出和捕获。抛出时使用throw关键字,捕获时使用try-catch块。
// www.javascriptcn.com code example
void riskyFunction() {
throw MyException("Something went wrong!");
}
int main() {
try {
riskyFunction();
} catch (const MyException& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}5. noexcept 关键字
what()方法通常被标记为noexcept,表示该方法不会抛出异常。这是为了确保在异常处理过程中不会引发新的异常。
virtual const char* what() const noexcept override {
return message.c_str();
}通过以上步骤,你可以轻松地在C++中创建和使用自定义异常类。