在 C++ 中,您可以像这样声明具有异常规范的函数:
int foo() const throw(Exception);
我找到了这两个链接:
但有几件事最终没有答案......
问题1:为什么要添加异常规范?它会带来任何性能提升吗?编译器会有什么不同?因为它对我来说就像程序员的信息。
问题 2:如果我抛出不符合规范的东西,会发生什么(应该发生什么)?例如:
int foo() throw(int) {
throw char; // Totally unrelated classes, not types in real
}
问题 3: 函数/方法不应该抛出任何东西。我发现至少有两种(三种,不同编译器的替代语法)指定不抛出异常的方法:
int foo() throw();int foo() __attribute(nothrow)__ 用于 gccint foo() nothrow 用于 Visual C++哪个是“正确的”?有什么不同吗?我应该使用哪一个?
问题 4:“标准异常”,bad_alloc,bad_cast,bad_exception,bad_typeid 和 ios_base::failure。
好的 bad_alloc 是 self 解释的,我知道如何(更重要的是何时)使用它(添加到异常规范),但其他的呢?他们都没有真正敲响警钟......他们与哪些“代码片段”相关联?就像 bad_alloc 与 new char[500000] 相关联。
问题 5:如果我有异常类层次结构,如下所示:
class ExceptionFileType {
virtual const char * getError() const = 0;
};
class ExceptionFileTypeMissing : public ExceptionFileType {
virtual const char *getError() cosnt {
return "Missing file";
}
}
我应该使用:
int foo() throw(ExceptionFileType);
或者:
int foo() throw(ExceptionFileTypeMissing,ExceptionFileTypeNotWritable,ExceptionFileTypeNotReadable,...)
注意:带有引用文献的答案会很棒。我正在寻找好的实践技巧。
最佳答案
简单的“良好做法”提示是:不要使用异常规范。
基本上唯一的异常(exception)是空异常规范的可能性:throw()。这非常有用,在 C++11 中它被赋予了自己的关键字 (noexcept)。尽管人们普遍认为任何非空异常规范都是糟糕的想法。
异常规范(noexcept 除外)已被正式弃用——并且与许多已弃用的功能不同,删除它对源代码的影响很小,我认为它很有可能最终会被删除(当然不能保证,但无论如何都是相当公平的机会)。
至于当/如果您确实抛出异常规范不允许的类型的异常时会发生什么:std::unexpected() 被调用。默认情况下,调用 terminate()。您可以使用 std::set_unexpected 来设置您自己的处理程序——但您可以合理地做的几乎就是在 terminate() 之前添加一些日志记录。您的意外处理程序不允许返回。
关于c++ - 函数异常规范和标准异常 - foo() throw(Exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418180/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我正在学习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
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
在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
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只