我想构建一个类,它的函数可能会抛出我想在使用时捕获的异常。 我从标准异常类继承 my_exception 。 我实现了 what() 函数,以便它返回一个存储在私有(private)字符串变量中的字符串
我认为将异常定义为嵌套类会更好,就像在 iostream 库中使用 ios_base::failure 完成的方式一样。
我不太确定的是,我应该在哪里以及如何定义 my_excpetion 的对象。我希望我能看到 iostream 函数的内部代码,看看它们是如何做到的。 我考虑了几个选项:
对于每个异常原因,我都可以定义一个 my_exception 的静态实例,并使用一个构造函数获取一个字符串并将其保存到我的私有(private)字符串指针中。
对于每个异常原因,我可以定义另一个继承自 my_exception 的类,并将 what 作为返回常量字符串的函数(原因)实现。 我可以持有每个异常子类的实例,或者抛出类型。 顺便说一句,我们通常什么时候抛出类型而不是实例?
我猜是错的:每次我想抛出一个异常时,都要用一个获取字符串的构造函数来创建一个新的 my_exception。这是在 Java 中完成的,但据我所知,这在 C++ 中会出现问题,因为应该在某处删除异常。对吧?
我认为第一个是正确的,是吗? 还有更多标准选项吗?
非常感谢!
最佳答案
简短回答:您将希望将异常作为对象而不是指针来抛出。您将捕获它们作为引用。
更长的答案:您列出的所有选项都是有效的。一般来说,您之所以要抛出一个对象而不是一个指针,是因为当异常被捕获时您给自己和您的客户的选择。
如果你通过指针捕捉,catch (my_exception* e) 那么你看它不知道你是否应该删除内存。
如果您按值捕获,catch (my_exception e) 如果异常对象最终成为具有其他一些派生类的基类,那么您就有被切片的风险。
通过引用捕获没有这些问题。如果你写 catch (my_exception& r) 那么你就可以捕捉到多态对象,而且你不必担心释放内存。
所以,回答你的另一个问题,当你抛出时,只需抛出一个临时对象:throw my_exception()。这会创建一个临时对象(可能)在抛出时复制,通过引用捕获,并在 catch block 末尾超出范围时自动销毁。 (这实际上是按引用捕获优于按值捕获的另一个好处,因为按值捕获在被捕获时会创建另一个拷贝。)
至于您的其他派生异常类,这是一种样式选择。使用不同的 what() 实现从 my_exception 派生是非常标准的。我不会说你需要花时间将字符串或实例存储在静态对象中——它们很小,与抛出异常时展开堆栈的过程相比,构建一个几乎不需要时间。
关于c++ - C++ 中定义异常类和抛出异常的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6159665/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun