草庐IT

c++ - 我应该向现有代码库添加异常处理吗?

coder 2024-02-21 原文

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

我致力于在 Windows 环境中控制硬件卡的 SDK。

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

我们链接到正确的库,以便我们使用 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 的稳定性。我们正在考虑添加异常处理,但我不相信这是提高稳定性的正确方法。我不得不承认我对 EH 没有太多经验。

一般来说,代码会在取消引用之前检查是否被 0 除或检查 NULL 指针。但是,还是会发生这样的情况。由于除以零或取消引用 NULL 指针不会引发异常,我想知道通过 100 000 行代码并添加异常处理有多大用处,这将改变工作流程并且如果不处理可能会导致内存泄漏适本地。我尝试过 SEH,但我认为开始使用 SEH 没有意义,而且它是 Microsoft 特定的,不是吗?

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

此外,如果我要添加异常处理,我将如何进行?一次修改所有模块或自下而上开始(意思是,如果模块 A 调用模块 B,模块 B 调用模块 C,我会修改 C,然后修改 B,然后修改 A,因为我们发布软件的频率很高,而且我们可能只有时间在下一个版本之前修改 C)。

谢谢!

最佳答案

I'd like to know the advantages and disadvantages of adding exception-handling to existing code.

你没有说出你所说的“异常处理”的确切含义,所以我将从一些基本的东西开始:标准 C++(你将问题标记为 c++)要求你写为除微不足道的应用程序之外的所有应用程序“处理异常”的代码,否则您的代码是错误的。 C++ 标准库的各个部分都允许抛出异常,包括示例代码使用的 new。因此,您的代码很可能已经有可能在其中抛出异常,它必须“处理”。在那种情况下会发生什么?基本上,您必须写“exception safe code”。

  • 程序在遇到异常时泄漏资源是错误的。你使用 RAII,所以你应该没问题。
  • 任何对象在抛出异常后进入不一致状态都是错误的。确保可能会更加棘手。

您应该首先关注使您的代码异常安全。

关于c++ - 我应该向现有代码库添加异常处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968628/

有关c++ - 我应该向现有代码库添加异常处理吗?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  9. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  10. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

随机推荐