当没有待处理的异常在堆栈的上层处理时,C++标准对以下代码应该如何处理?try{throw;}catch(...){cerr空投会不会被接住? 最佳答案 来自2003C++标准§15.1[except.throw]/8:Ifnoexceptionispresentlybeinghandled,executingathrow-expressionwithnooperandcallsterminate().因此,在您的示例中,由于当前未处理任何异常,因此不会抛出任何内容,而是调用terminate()。由于terminate()没有返回
在C++中,您可以像这样声明具有异常规范的函数:intfoo()constthrow(Exception);我找到了这两个链接:http://www.cplusplus.com/doc/tutorial/exceptions/和http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr156.htm但有几件事最终没有答案......问题1:为什么要添加异常规范?它会带来任何性能提升吗?编译器会有什么不同?因为
在C++11中,这已被弃用:voidfoo()throw();并替换为voidfoo()noexcept;在thisarticle据解释,这样做的原因(除其他外,归结为同一件事)是C++exceptionspecificationsarecheckedatruntimeratherthanatcompiletime,sotheyoffernoprogrammerguaranteesthatallexceptionshavebeenhandled.虽然这对我来说确实有意义,但我不明白为什么首先要动态检查throw(),或者为什么noexcept不提供异常保证除了调用std::termin
请注意:在我们开始真正的问题之前,这里有很多背景信息。我有一个相当广泛的C++类层次结构(代表不同类型的表达式):classBaseValue{virtual~BaseValue();};classIntValuefinal:publicBaseValue{intget()const;};classDoubleValuefinal:publicBaseValue{doubleget()const;};classStringValuefinal:publicBaseValue{std::stringget()const;};另一方面,我有一种方法可以将用户的输入强制转换为预期的类型:cl
写法有区别吗:throwSomeException;和throw(SomeException);我看到一些消息来源声称后者(带括号)出于某种原因不是一个好的选择,但遗憾的是我不记得我在哪里看到过这个。 最佳答案 除了括号之外,这两个表达式之间应该不有任何功能上的差异。我从未听说过任何明确的理由说明为什么一个人应该优于另一个人。对我来说,第一个选项看起来更直观,因为它不包含不必要的括号!另外正如@Pubby在评论中所说,不应与需要括号的throw说明符混淆(throw说明符可能deprecated)。
我一直试图找出为什么在Debug模式下调试我们的程序需要这么长时间。在使用xperf查看堆栈的样子后,很明显我们在迭代器和STL容器上花费了大量时间。我在谷歌上搜索了一会儿,找到了选项_HAS_ITERATOR_DEBUGGING=0_SECURE_SCL=0_SECURE_SCL_THROWS=0我用#define在代码中设置所有这些#define_HAS_ITERATOR_DEBUGGING0#define_SECURE_SCL0#define_SECURE_SCL_THROWS0但这似乎没有用,所以我尝试使用visualstudio项目中的预处理器定义,但似乎仍然没有帮助。我已经
如果我有如下代码:try{doSomething();}catch(...){noteError();}voidnoteError(){try{throw;}catch(std::exception&err){std::cerrnoteError()下部框架内的两个地方都会抛出原始异常吗? 最佳答案 您的原始代码很好。您捕获了不同的异常类型并调用了一个函数来记录一条消息并重新抛出。throw语句不需要直接出现在相应的catchblock中。但是,如果您调用其中一个“注释”函数并且您没有当前正在处理异常,那么您的程序将调用termin
我正在尝试了解C++中的错误处理。我读到过,使用try、throw、catch比使用带有返回值的if语句更好,也更简单。但我不确定我是否真的理解try,throw,catch是如何工作的。我在下面做了一个简单的例子,如果能得到关于任何问题或不良风格的反馈,那就太好了。我的目标是根据示例创建一个函数来检查另一个计算的结果。以下是我对try、throw、catch的疑问:(1)catch语句应该包含在我的函数中吗?或者它应该在其他地方,比如在main()中或在完成初始计算的函数中?(2)对这么简单的事情使用try、catch、throw是不是太过分了(我想改进我的风格)?(3)如果有错误,
以下不编译:classFoo{public:Foo(boost::shared_ptrarg);};//intest-caseboost::shared_ptrbar;BOOST_CHECK_THROW(Foo(bar),std::logic_error);//compilererrorhereBar的实现无关紧要。编译器提示Foo没有合适的默认构造函数(VC++2005)。如果我添加一个默认构造函数,它就会工作,并且它实际上会被调用。为什么此语句需要默认构造函数? 最佳答案 发生这种情况是因为BOOST_CHECK_THROW是一
根据OptimizingC++,Usetheemptyexceptionspecification(thatis,appendthrow()tothedeclaration)forthefunctionsyouaresurewillneverthrowexceptions.如果我知道我的90%的方法不会抛出异常怎么办?将throw()附加到所有这些方法似乎非常规且冗长。如果没有,有什么好处?还是我误解了什么? 最佳答案 C++11引入了noexcept,throw有点被弃用(并且根据this效率较低)noexceptisanimpr