请注意,此函数没有“{”和“}”主体。只是一个try/catchblock:voidfunc(void)try{...}catch(...){...}这是有意成为C++的一部分,还是g++扩展?除了绕过1级{}之外,还有其他目的吗?在遇到http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html之前我从未听说过这个。 最佳答案 是的,那是有效的C++。我发现它的一个目的是将异常转换为返回值,并将返回值中的异常转换代码与函数中的其他代码分开。
默认的catch语句catch(...){}如何通过值或引用捕获异常?其次,默认的throwthrow;是怎么抛出异常的,是按值还是按引用? 最佳答案 catch-allcatch(...)根本不会让您访问异常对象,所以这个问题没有实际意义。[更正:]用throw;重新抛出会抛出原始对象。如果处理程序按值捕获,则对本地拷贝的更改不会影响原始的、重新抛出的对象。[/]有关详细信息,请参阅15.3(尤其是第17条)。查看右侧的一些相关问题,例如thisone或thisone和thisone和thisone.
有人提出不同的问题建议使用catch(...)通过包围整个main()来捕获所有其他未处理的-意外/不可预见的异常与try{}catch(...){}block。这听起来是一个有趣的想法,可以节省大量调试程序的时间,并至少留下一点线索。问题的本质是可以通过这种方式恢复哪些信息(除了我留下的任何调试全局变量),以及如何恢复它(如何访问并识别任何catch被调用)此外,还有哪些注意事项与之相关。特别是:它会与稍后发芽的线程一起使用吗?它不会破坏处理段错误(在其他地方作为信号捕获)它不会影响其他不可避免地嵌套在其中的try...catchblock,它们可以处理预期的异常吗?
我有一个有时会引发异常的第三方库。所以我决定将我的代码包装在try/catch(...)中,这样我就可以记录有关异常发生的信息(没有具体细节,只是它发生了。)但由于某种原因,代码仍然崩溃。在客户端计算机上,它会严重崩溃,并且在catch(...)中记录异常的代码永远不会被执行。如果我在我的调试/开发机器上运行它,我会弹出询问我是否要调试的窗口。当我这样做时,它会报告0xC0000005:访问冲突读取位置XXX。奇怪的是,对于旧版本的第三方库,完全相同的代码确实会捕获异常,并且会执行记录异常的代码。(我在VS中验证了这一点,观察相同的情况发生。)这是正在执行的伪代码:pObject=pS
今天我在catchblock中发现了一个错误:catch(constexception&e){//dosomething//throwe;基本上,如果我重新抛出异常e显式,我会得到一个新的std::exception重构,实际上是来自what()方法是默认的std::string,而不是我自定义构建的消息。解释是什么?我以为throw;只是throwExceptionJustCaught;的简写。 最佳答案 异常对象有点特殊。它们是在内存中的一个特殊位置构建的,它们的生命周期取决于它们被捕获的catchblock。如果你说throw
这个问题在这里已经有了答案:Isthereanywaytogetsomeinformationatleastforcatch(...)?(5个回答)关闭7年前。我有一个trycatch子句,其中最外面的catch(...)直到现在才发生。在进行了一些更改之后,在某个地方抛出了我在其他情况下无法处理的异常。即使我用(...)捕获它,有没有办法至少获取一些关于异常的信息?catch(constcone::BeginnersLibException&ex){//handletheexception}catch(conststd::exception&ex){//handlestdexcept
我正在使用backtrace从引发异常的位置获取信息。在我的异常的构造函数中,我将回溯存储在std::string中,在这种类型的异常的catchblock中,我正在打印这个回溯。但我想知道,是否有可能以某种方式在catchblock中为其他异常类型获得相同的回溯? 最佳答案 您可能对正在开发的Boost库感兴趣:PortableBacktrace.示例:#include#includeintfoo(){throwboost::runtime_error("MyError");return10;}intbar(){returnfoo
一般来说,我倾向于将try/catch用于具有多个故障点的代码,这些故障点有一个共同的处理程序。根据我的经验,这通常是在执行某些操作之前限定输入或上下文的代码,或者在执行某些操作之后限定输出。我已从文献和同事那里得到建议,以尽量减少此类代码块中的代码,我接受这通常是好的建议。我想进一步了解上述建议的基础:开销的性质是什么?最近是否有针对try/catchblock的推荐使用(或避免使用)的开发指南?更快的处理器和更现代的编译器在多大程度上缓解了try/catch的问题?提前感谢您的帮助,AJ 最佳答案 在c++中,成本取决于实现。一
我正在用C++编写程序。该程序在Win32(x86)上运行良好,最近我尝试为x64本地编译它。当然,事情并没有立即奏效。调试问题后,我设法用这个简单的代码片段重现了它:classMyException{};intmain(){try{for(;;){try{std::cout(我将很快解释if(1==0)子句)使用MSVCforx86编译此代码时(我使用的是2010),结果符合预期:ThrowingCatch1ThrowingCatch1ThrowingCatch1ThrowingCatch1...以此类推,无限循环。但是,为x64编译此代码会导致:ThrowingCatch2Done
这是super基本的,但我无法在任何地方找到答案。有很多关于throw和捕捉的帖子,但是如果我从function1throw然后从function2调用function1会发生什么但不捕获它,这是否意味着它只是被重新抛出给function2的调用者?从以下内容来看,我会说是的,但我想在我坚持下去之前得到一个可靠的大师般的答案并假设:#includevoidfunction1(){throw1;}voidfunction2(){function1();}intmain(){try{function2();}catch(...){std::cout输出:抓到了!