【C++】自定义异常处理类 与错误码 的通用实现与使用

在 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

定义了两个错误代码 OKERR,分别表示无错误和有错误。

MyException

  • 私有成员变量msg,用于存储格式化的错误消息。
  • 构造函数:接受错误消息、错误代码、文件名、函数名和行号,生成一个格式化的错误描述,并使用 printf 打印出来。
  • what() 方法:重写了 std::exceptionwhat() 方法,返回错误消息。

MyException

定义了一个宏,用于简化 MyException 对象的创建过程,自动填充文件名、函数名和行号。

main 函数

main 函数中,我们抛出了一个 MyException 异常,异常消息为 "这是我的异常:This is my custom exception!",错误代码为 ErrCode::ERR

总结

通过这个示例,我们可以看到如何定义一个自定义的异常处理类,并在程序中使用它。自定义异常类可以让我们更灵活地处理错误情况,提供更丰富的错误信息。在实际开发中,你可以根据需要扩展这个类,增加更多的功能,比如支持不同的日志级别、错误处理策略等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值