草庐IT

C++11(或 Boost)system_error 策略

coder 2024-02-04 原文

我正在开发一个系统,该系统旨在使用名为 error_codeerror_conditionerror_category 的类——一个新的方案std:在 C++11 中,尽管目前我实际上正在使用 Boost 实现。我读过 Chris Kholkoff 的 series of articles ,现在三遍了,我想我了解了如何创建这些类。

我的问题是这个系统需要处理存在于单个 DLL 中的插件,而插件可能会出错。我最初的设计是计划一个特定于系统的错误类别,该类别将包含所有各种错误代码和未真正映射到 errno 值的特定错误条件的候选列表。这里的问题是,要使 DLL 能够使用这些错误代码之一,它需要访问应用程序中 error_category 的唯一实例。我现在通过从每个 DLL 中导出一个 SetErrorCategory() 函数来处理这个问题,它可以工作但是有点恶心。

我看到的替代解决方案是每个 DLL 都有自己的错误类别和代码,如果需要,还有自己的条件;我怀疑这更像是为这个库功能所设想的。但是,我认为这需要在主应用程序的错误方案中有一个比较函数,该函数了解插件的错误方案,并可以检查哪些应用程序的条件与插件的错误相匹配。这似乎更容易出现一堆问题,尽管我还没有尝试实现它。我猜我必须在所有实际逻辑之上从 DLL 导出整个错误方案。

当然,另一种方法是仅使用 DLL 中的数字错误代码并将它们填充到应用程序端的错误对象中。它具有插件简单的优点,但可能会导致应用程序出现问题(例如,一个函数处理来自几个不同插件的对象需要注意每个错误的来源)。

所以我的具体问题是:在这三个选项中,您会使用哪个,为什么?哪个明显行不通?当然,还有我没有想到的更好的方法吗?

最佳答案

我在处理这个问题时得出的解决方案是使用预定义代码来处理问题系列和用户子代码选择,以及针对特定错误类型的继承。使用 boost 这让我可以通过以下方式继承特定类型:

struct IOException : virtual std::exception, virtual boost::exception {};
struct EOFException : IOException {};
...

并保留与 IOException 等预定义一般错误相匹配的错误代码。因此,我可以为每个错误系列提供一个通用代码范围:

namespace exception { namespace code {
    UNKNOWN_EXCEPTION           = 0;
    IO_EXCEPTION                = 100;
    CONCURRENCY_EXCEPTION       = 200;
    ...
}}

然后,如果有人想要一个新的错误类型,他们可以从已经定义的通用异常类型和与该错误一起出现的代码继承,并通过继承类型和次要值 (0-99) 专门化异常。这也允许 try catch block 捕获更具体的错误类型,同时让更通用的异常版本传递给其他控制 block 。然后用户可以自由使用父异常代码或指定他们自己的家庭代码(parent = 100 -> child = 115)。如果用户只是想要一个 IOError,而不需要创建新的错误系列,他们可以毫不费力地使用默认的系列异常。我发现这为用户提供了灵 active ,而无需 OCD 在他们不想要时跟踪异常代码。

然而,这绝不是最终的解决方案,因为个人偏好引导了我在这里的设计选择。我发现有太多的错误代码变得困惑,异常继承已经编码了这个信息。实际上,在我描述的系统中,很容易完全去除错误代码并仅依赖异常继承,但许多人更喜欢为每个异常名称分配一个代码。

关于C++11(或 Boost)system_error 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12169495/

有关C++11(或 Boost)system_error 策略的更多相关文章

  1. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

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

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

  3. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  4. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

    运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

随机推荐