gpt4 book ai didi

c++ - 如何在 C++ 中记录异常情况?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:59 34 4
gpt4 key购买 nike

在编写函数时,我的实现经常是这样的:

  • 调用子函数
  • 如果此子函数执行失败(因为异常情况):记录此失败并中止当前函数
  • 否则继续调用其他子函数,这又会失败

一个关键部分是日志记录。每个失败的函数都应该在日志中添加一个简短的描述。这样,在处理异常的级别,可以向用户显示详细的错误消息。

例如,考虑一个可以创建新用户帐户的应用程序,但数据库连接存在问题。以下反向堆栈跟踪结果:

  • SQLDriverConnect() -> “SQLDriverConnect 错误:未找到数据源且未指定默认驱动程序”
  • OpenDatabaseConnection() -> “无法打开数据库连接”
  • CreateUser() -> “创建新用户失败”
  • ValidateAndSaveNewUserAccount() -> “未能保存用户配置文件”
  • 捕获异常并向用户显示记录的消息

使用异常功能,我将按如下方式实现:

void CreateUser()
{
try {
OpenDatabaseConnection();
}
catch(std::exception& e) {
e.AddLog("Failed to create the new user");
throw;
}
//...
}

使用一个简单的返回值,我将编写以下内容:

bool CreateUser(Log& log)
{
if (!OpenDatabaseConnection(log))
{
log.Add("Failed to create the new user");
return false;
}
//...
return true;
}

我发现这两种实现方式同样出色。因此,我看不出使用异常有什么好处。我很清楚异常处理通常被认为是一个有用的特性,但我不太明白为什么。很久以前,我广泛使用了异常处理,但没有看到很大的优势,所以现在我不再使用它们了。因此我的问题:

  • 使用异常,如何在 C++ 中更简洁地实现?
  • 如果不是,那么抛出异常相对于返回“成功” bool 值的优势是什么?

注意:我使用术语日志记录 来表示“收集对错误原因的解释,以便稍后可以将其呈现给用户”。我宁愿不将该解释存储在日志消息的全局集合中(在内存中、文件中或数据库中),因为它直接描述了特定的异常。

更新:感谢您到目前为止的回复。我知道异常只有在用户不需要对出错的详细反馈时才有用。 (如果我误解了这一点,请纠正我。)

最佳答案

您的策略似乎避免了异常最有用的方面,您可以抛出一个已经包含日志信息文本的异常类——即在抛出异常时为日志生成文本,而不是在捕获异常的时间。这样您就不必在堆栈的每一层都进行捕获,而只需在顶层进行捕获即可。

因此只有一个 try block 和一个 log.add - 通常代码少得多。类似这样的事情似乎会删除您的所有复制。

void OpenDatabaseConnection()
{
if (Error) throw MyException("Failed opening database");
}

void CreateUser()
{
try {
OpenDatabaseConnection();
//...... do everything here
}
catch(MyException& E) { //only one copy of this code
E.AddLog(E.getMessage());
throw;
}
}

关于c++ - 如何在 C++ 中记录异常情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1797341/

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