gpt4 book ai didi

具有精心设计的异常机制的 C++ 项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:35 26 4
gpt4 key购买 nike

有谁知 Prop 有设计良好/强大的异常机制的开源 C++ 应用程序,以便我获得一些灵感?我看到的大多数代码/示例都会做一些有问题的事情,例如:

  1. 以消息字符串作为参数抛出对象。似乎是错误的,因为它将异常标记为致命异常,可以向更高层的用户显示的错误消息为尝试处理异常的客户端代码留下了很小的空间。即使异常是致命的,不同的语言环境(语言)之类的事情也会让在抛出点格式化消息对我来说似乎是个坏主意。
  2. 使用大量派生自异常基类的不同异常类。为每一件可能出错的事情(打开文件、读取文件、写入文件、创建线程等)引入一个新的类/类型感觉不对。使用基本类型在最高级别捕获所有未处理的异常会丢失显示有意义的错误消息所需的类型信息。
  3. 为每个组件/库使用一个派生自异常基类的异常类,并为其提供一个错误代码作为参数以指示确切的错误。捕获基类型会导致歧义。 (我们捕获了谁的错误代码“3”?)...

一些正确方向的指示将受到欢迎。

最佳答案

为了解决所有这三个问题,我发现对我来说最好的方法是抛出我自己的派生自 std::runtime_error 的自定义异常。像这样:

#include <exception>

class ChrisAException : public std::runtime_error
{
/// constructor only which passes message to base class
ChrisAException(std::string msg)
: std::runtime_error(msg)
{

}
}

它允许接受一个字符串,我总是把它放在类似下面的格式中(假设 x negative 不是一个有效的输入并且意味着调用它的东西是错误的):

#include "ChrisAException.h"

void myfunction(int x)
{

if(x < 0)
{
throw ChrisAException("myfunction(): input was negative!");
}

// rest of your function
}

对于这一个,请记住这些异常中的字符串更多是为程序员而不是最终用户提供的。当出现故障时,界面的程序员的工作是在语言环境中显示一些有意义的东西。异常中的字符串可以在调试时记录或查看(最好!)

这样你就可以最终捕获它:

try
{
// high level code ultimately calling myfunction

}
catch(ChrisAException &cae)
{
// then log cae.what()
}
catch(std::runtime_error &e)
{
// this will also catch ChrisAException's if the above block wasn't there
}
catch(...)
{
// caught something unknown
}

我个人不喜欢导出太多类型的异常,或者给出错误代码。我让字符串消息进行报告。

一般来说,我使用 C++ 异常来表示“程序出了点问题”,不是来处理正常用例。因此,对我来说,算法执行期间抛出的异常要么意味着“标记用户出了问题”要么“不告诉用户”(取决于代码对他们所做的事情的重要性)但肯定会记录它并以某种方式让程序员知道。

我不使用 C++ 异常来处理本质上不是编程错误的情况,例如,某种不正确的逻辑或被称为错误的东西。例如,我不会使用 C++ 异常来处理正常的程序情况,例如空 DVD 不在 DVD 写入程序的驱动器中。为此,我有明确的返回代码,允许用户知道那里是否有空 DVD(可能带有对话框等)

请记住,C++ 异常处理的一部分是将堆栈展开到 try-catch block 。对我来说,这意味着中止程序中正在发生的事情并清理堆栈。在像我的 DVD 示例这样的情况下,您不应该真的想要展开很多堆栈。这不是灾难性的。您应该简单地让用户知道,然后让他们重试。

但是,根据我的经验和阅读,这是我使用 C++ 异常的首选方式。我对其他意见持开放态度。

编辑:根据评论者的建议将 std::exception 更改为 std::runtime_error

关于具有精心设计的异常机制的 C++ 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10325330/

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