我目前正在使用VisualStudioExpressC++2008,并且对catchblock排序有一些疑问。不幸的是,我在互联网上找不到答案,所以我向专家提出这些问题。我注意到除非将catch(...)放在catchblock的末尾,否则编译将失败并出现错误C2311。例如,以下将编译:catch(MyException){}catch(...){}而以下不会:catch(...){}catch(MyException){}一个。请问这是在C++语言标准中定义的,还是微软编译器严格的问题?C#和Java也有相同的规则吗?顺便说一句,我还尝试制作一个基类和一个派生类,并将基类的catc
我正在尝试了解C++中的错误处理。我读到过,使用try、throw、catch比使用带有返回值的if语句更好,也更简单。但我不确定我是否真的理解try,throw,catch是如何工作的。我在下面做了一个简单的例子,如果能得到关于任何问题或不良风格的反馈,那就太好了。我的目标是根据示例创建一个函数来检查另一个计算的结果。以下是我对try、throw、catch的疑问:(1)catch语句应该包含在我的函数中吗?或者它应该在其他地方,比如在main()中或在完成初始计算的函数中?(2)对这么简单的事情使用try、catch、throw是不是太过分了(我想改进我的风格)?(3)如果有错误,
关闭。这个问题需要detailsorclarity。它目前不接受答案。想改进这个问题吗?添加细节并通过editingthispost澄清问题。关闭5年前。Improvethisquestion到目前为止(不幸的是)C++不支持try语句的finally子句。这引发了对如何释放资源的猜测。在网上研究了这个问题后,虽然我找到了一些解决方案,但我并没有弄清楚它们的性能(如果性能不是那么重要,我会使用Java)。所以我必须进行基准测试。选项是:CodeProject提出的基于仿函数的finally类。它很强大,但速度很慢。反汇编表明,外部函数局部变量的捕获效率非常低:一个一个地插入堆栈,而不是
首先,我最近的编码是Java,我不想“用C++写Java”。事情是这样的,我必须创建一个不可变的类。这很简单。唯一的问题是获取初始值是一些工作。所以我不能简单地调用initializes来初始化我的成员。那么创建这样一个类的最佳方式是什么?以及如何以C++标准向外界公开我的不可变/最终属性?这是一个示例类:classMsg{private:int_rec_num;int_seq;stringtext;public:Msg(constchar*buffer){//parsethebufferandgetourmemberhere...//...lotsofcode}//doesthisl
在阅读HurbSutter的“MoreExceptionalC++”时,我偶然发现了以下代码://Example19-5:Alternativerightsolution//T::Close(){//...codethatcouldthrow...}T::~T()/*throw()*/{try{Close();}catch(...){}}我的理解是,这不是一个好主意。因为,如果在堆栈展开期间由于异常调用了T析构函数,然后Close()抛出异常,那么这将导致调用Terminate()。有人可以阐明这一点吗?提前致谢。 最佳答案 Myu
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。这个结构的创造者是棒球迷吗?
每次我看到catchall语句时:try{//somecode}catch(...){}它一直是一种滥用。反对使用cacheall子句的论点是显而易见的。它会捕获任何,包括操作系统生成的异常,例如访问冲突。由于异常处理程序不知道它在处理什么,在大多数情况下,异常将表现为模糊的日志消息或一些不连贯的消息框。所以catch(...)看起来天生就是邪恶的。但它仍然在C++中实现,其他语言(Java、C#)也实现了类似的机制。那么在某些情况下它的使用是合理的吗? 最佳答案 (1)声明将捕获操作系统异常是不正确的。您对“访问冲突”一词的使用背
这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:DoesC++support'finally'blocks?(Andwhat'sthis'RAII'Ikeephearingabout?)C++11是否支持try/catch/finally构造?我问是因为我找不到任何关于它的信息。谢谢。
在C++中,是如下代码try{foo();}catch(...){throw;}在语义上等同于像这样调用foo吗?foo();如果是这样,我是否可以期望最先进的编译器避免第一个版本到第二个版本(在启用优化的情况下编译时)?换句话说,如果我使用NDEBUG编译这段代码并启用优化try{foo();}catch(...){assert(some_check());throw;}我可以假设这个丑陋的版本永远不会慢吗#ifndefNDEBUGtry{#endiffoo();#ifndefNDEBUG}catch(...){assert(some_check());throw;}#endif
假设我有以下代码:#include#include#includeintmain(){boost::threadthd([]{std::cout每次启动该程序时,MSVC-12.0和boost1.55都会给我不同的输出。例如,strFinishedstrFinishedstrRunning当我将boost::chrono::nanoseconds更改为boost::chrono::microseconds时,输出看起来符合预期。为什么?我究竟做错了什么?这是boost库中的错误吗?是否有关于boost错误跟踪器的票证?提前致谢。 最佳答案