gpt4 book ai didi

c++ - 这种错误记录方案有什么问题吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:59 24 4
gpt4 key购买 nike

我写了这个接口(interface):

//The idea is to use EHPrint to construct the error msg and then raise an error or
//a warning, etc. This removes the need to implement all 3 'Raise' functions
//as taking variable param list reducing code.
class ErrorHandler
{
public:
virtual void RaiseError(bool, int) = 0;
virtual void RaiseWarning(int) = 0;
virtual void RaiseMsg() = 0;

__attribute__((format(printf, 1, 2)))
virtual const char* EHPrint(const char*, ...) = 0;

virtual ~ErrorHandler(){}
};

忘掉多线程问题,因为一个对象只会在一个线程中使用。实现类可以记录、向用户提出错误或根据需要终止。缺点是您必须先调用 EHPrint 才能引发错误等。有什么方法可以使它更漂亮吗?

编辑: 当我想 RaiseError 时,我真的很想只调用一个函数。截至目前,我必须调用 EHPrintf,然后调用 RaiseError

编辑2: 我认为将错误处理和错误记录结合在一起是我的错误。将尝试将它们分开并查看。

编辑3: 我想我现在应该发布记录器:

class Logger                                                        
{
public:
enum LogType
{
LT_DEBUG = 0,
LT_WARNING,
LT_ERROR,
LT_STAT,
LT_TEXT
};

__attribute__((format(printf, 5, 6)))
virtual const char* EHLog(LogType,
int,
const char*,
int,
const char*,
...) = 0;

virtual ~Logger(){}
};

这会清除代码,因为现在日志记录是独立的。

最佳答案

大多数支持多级别日志消息的日志记录库仅使用一个函数来生成消息,并且该函数采用一个附加参数来指示日志消息的级别。

在您的结构中,它可能看起来像这样:

class ErrorHandler                                                            
{
private:
virtual void RaiseError(bool, int) = 0;
virtual void RaiseWarning(int) = 0;
virtual void RaiseMsg() = 0;
public:
enum LogLevel {
ERROR,
WARNING,
MSG
};

__attribute__((format(printf, 2, 3)))
virtual const char* EHPrint(enum LogLevel, const char*, ...) = 0;

virtual ~ErrorHandler(){}
};

您必须考虑的一些其他要点:

  1. 可变参数函数与非 POD 类型一起使用是不安全的。如果您使用 printf 样式的函数进行日志记录,您的用户将仅限于记录原始类型。像 std::string 这样的类 不能 被使用。
  2. 使用用于准备和发送消息的两次调用设置,您必须准备好用户在调用 RaiseXXX 函数之一之前多次调用 EHPrint

此外,我支持 DumbCoder 的评论,看看现有的日志记录库,只要看看它们在设计和/或 API 上有什么共同点。

关于c++ - 这种错误记录方案有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3940720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com