在 C++ 开发过程中,正确处理异常对于编写健壮的程序至关重要。标准库提供了 std::exception
类,我们可以通过继承它来创建自定义的异常类。本文将介绍一个示例代码,展示如何定义和使用一个自定义异常处理类 MyException
。
概述
MyException
类继承自 std::exception
,用于封装错误信息和错误代码,并提供异常的描述。这个类在构造时接受错误消息、错误代码、文件名、函数名和行号,生成一个格式化的错误描述,并在抛出异常时打印出来。
使用方法
新建头文件err.h,然后复制如下代码。通过使用下面的头文件代码,就可以愉快的抛出异常了。
//err.h
#ifndef ERR_H
#define ERR_H
#include <exception>
#include <iostream>
//错误码,在这里设置你的错误错误码有哪些。
enum class ErrCode
{
OK = 0, //无问题
ERR = -1 //有错误
};
/**
* @brief 错误异常处理类,用于当程序发生致命错误时抛出。
*/
class MyException : public std::exception
{
private:
char msg[256]; //异常报错消息
public:
MyException(const char* message, ErrCode errcode, const char* file, const char* function, int line)
{
//防止file名称过长,截断到最后一个文件名
const char* filename = file + strlen(file);
while (--filename >= file)
if (*filename == '\\' || *filename == '/')
break;
filename++;
sprintf(msg,
"%s(%s :%s -line %d): %s ErrCode:%d %s\r\n",
"Error",
filename,
function,
line,
message,
static_cast<int>(errcode),
"");
printf("%s", msg);//在构造时打印错误信息
}
const char* what() const noexcept override { return msg; }
};
#define MyException(message, code) MyException(message, code, __FILE__, __FUNCTION__, __LINE__)
#endif //ERR_H
示例代码
#include <iostream>
#include <exception>
#include <cstdio>
#include <cstring>
using namespace std;
enum class ErrCode
{
OK = 0, // 无问题
ERR = -1 // 有错误
};
/**
* @brief 错误异常处理类,用于当程序发生致命错误时抛出。
*/
class MyException : public std::exception
{
private:
char msg[256]; // 异常报错消息
public:
MyException(const char* message, ErrCode errcode, const char* file, const char* function, int line)
{
// 防止文件名过长,截断到最后一个文件名
const char* filename = file + strlen(file);
while (--filename >= file)
if (*filename == '\\' || *filename == '/')
break;
filename++;
sprintf(msg,
"%s(%s :%s -line %d): %s ErrCode:%d %s\r\n",
"Error",
filename,
function,
line,
message,
static_cast<int>(errcode),
"");
printf("%s", msg);
}
const char* what() const noexcept override { return msg; }
};
#define MyException(message, code) MyException(message, code, __FILE__, __FUNCTION__, __LINE__)
int main()
{
throw MyException("这是我的异常:This is my custom exception!", ErrCode::ERR);
return 0;
}
代码解析
枚举类 ErrCode
定义了两个错误代码 OK
和 ERR
,分别表示无错误和有错误。
类 MyException
- 私有成员变量:
msg
,用于存储格式化的错误消息。 - 构造函数:接受错误消息、错误代码、文件名、函数名和行号,生成一个格式化的错误描述,并使用
printf
打印出来。 what()
方法:重写了std::exception
的what()
方法,返回错误消息。
宏 MyException
定义了一个宏,用于简化 MyException
对象的创建过程,自动填充文件名、函数名和行号。
main
函数
在 main
函数中,我们抛出了一个 MyException
异常,异常消息为 "这是我的异常:This is my custom exception!",错误代码为 ErrCode::ERR
。
总结
通过这个示例,我们可以看到如何定义一个自定义的异常处理类,并在程序中使用它。自定义异常类可以让我们更灵活地处理错误情况,提供更丰富的错误信息。在实际开发中,你可以根据需要扩展这个类,增加更多的功能,比如支持不同的日志级别、错误处理策略等。