C++ 我应该将异常处理添加到现有代码库中吗?

C++ 我应该将异常处理添加到现有代码库中吗?,c++,exception,C++,Exception,我想知道在现有代码中添加异常处理的优点和缺点 我使用的SDK在Windows环境中控制h/w卡 SDK由100多个相互交互的DLL组成。我们现有的代码库可能包含100000(如果不是1000000)行代码。我们的模块也是多线程的 我们与适当的库链接,以便使用nothrow new(lic.lib而不是licp.lib) 大多数代码都没有异常处理。编写代码时就考虑到了这一点 int *p = new int[size]; if (p == NULL) { // handle this cas

我想知道在现有代码中添加异常处理的优点和缺点

我使用的SDK在Windows环境中控制h/w卡

SDK由100多个相互交互的DLL组成。我们现有的代码库可能包含100000(如果不是1000000)行代码。我们的模块也是多线程的

我们与适当的库链接,以便使用nothrow new(lic.lib而不是licp.lib)

大多数代码都没有异常处理。编写代码时就考虑到了这一点

int *p = new int[size];
if (p == NULL)
{
   // handle this case...
   // most probably return an error code
}

char *q = new char[size];
if (q == NULL)
{
    delete[] p;
   // handle this case...
   // most probably return an error code
}
我们还使用RAII技术。例如,我们在堆栈上创建了一个对象,该对象自动等待并释放一个关键部分

我们希望提高SDK的稳定性。我们曾考虑添加异常处理,但我不认为这是提高稳定性的正确方法。我不得不承认我没有太多的经验

通常,代码在解引用之前会检查除数是否为0或空指针。但是,这种情况还是会发生的。由于被零除或取消引用空指针不会引发异常,我想知道遍历100000行代码并添加异常处理有多大用处,因为异常处理会改变工作流,如果处理不当,可能会导致内存泄漏。我尝试过SEH,但我认为开始使用SEH是没有意义的,它是微软特有的,不是吗

在我看来,我认为如果审查现有代码并简单地检查可能丢失的崩溃(如除以零)会更有用

另外,如果我要添加异常处理,我将如何继续?一次修改所有模块或从下至上开始(意思是,如果模块A调用模块B调用模块C,我将修改C,然后是B,然后是A,因为我们非常频繁地发布软件,在下一个版本之前,我们可能只有时间修改C)


谢谢大家!

对于遗留代码,您应该在时间表允许的情况下在一些地方引入异常处理;要么是代码中访问最少的区域(以减少代码库其余部分出错的风险),要么是它们产生最大效益的区域(中信国际错误处理有限公司出错位置)

我不建议仅仅为了到处添加异常处理而暂停遗留项目。遗留代码最难的部分是修改它并使其保持工作状态。毕竟,它已经被测试过了,它的行为也得到了很好的记录

我想知道在现有代码中添加异常处理的优点和缺点

你不能用“异常处理”来精确地表达你的意思,所以我将从一些基本的东西开始:标准C++(你把问题标记为)要求你编写代码,“处理异常”,除了所有的琐碎的应用程序之外,否则你的代码是“强”>“错误< /强”。允许C++标准库的各个部分抛出异常,包括示例代码使用的<代码>新< /代码>。因此,您的代码已经有可能在其中抛出异常,它必须“处理”。在这种情况下会发生什么?基本上,你必须写“”

  • 程序在遇到异常时泄漏资源是错误的。你使用RAII,所以你应该没事
  • 任何对象在抛出异常后进入不一致状态都是错误的。确保这一点可能要复杂得多

你应该首先关注代码异常的安全性。

< P>我同意Raedwald的观点,如果你使用C++而不需要非常仔细的编码标准来避免EH(EX:使用NoPoto新,避免标准容器等),我假设遗留代码没有,然后,代码已经被破坏,并且可能会泄漏,并且在遇到异常时,它可能会遇到一些零星的事情,例如
bad\u-alloc
或者
bad\u-cast
,如果您依赖
dynamic\u-cast

也就是说,从遗留代码库的非常实用的角度来看,遗留代码很可能成功地摆脱了它。毕竟,有多少非平凡的应用程序可以从
bad_alloc
异常中优雅地恢复,而不需要对内存分配进行非常明确的控制?不多,也不会让整个世界陷入一个尖叫般的停顿

所以我实际上不建议重写遗留代码来捕获异常并在任何地方使用RAII。您可能会在代码中到处使用RAII,您绝对需要修改,但我会尝试寻找不进行太多更改的原因。为它编写测试,尝试稳定它,并将它变成一个黑匣子;一个功能库,在无止境地涉水时使用、不维护和更改

现在,我在这里投稿并恢复这条旧线索(抱歉!)的主要原因是因为以下评论:

通常,该代码会检查除数是否为0或NULL 取消引用之前的指针。但是,这样的一个 这种情况将会发生。因为被零除或取消引用空指针 不要抛出异常[…]

在我看来,您不应该抛出对空指针访问或被零除的响应,因为这些都是程序员错误。除非您在一个任务关键型软件中工作,即使软件有缺陷,您也希望能够正常恢复,以降低生命损失风险或类似情况,否则您不希望应用程序在出现编程错误时正常恢复。您通常不想这样做的原因是,它有隐藏bug的缺点,使它们保持沉默,允许用户忽略和解决它们,甚至不必报告它们

相反,对于程序员的错误,您通常应该支持
assert