在C++中,throw;在catchblock内执行时会将当前捕获的异常重新抛出block外。在thisanswer当经常使用复杂的异常处理时,异常调度器的想法被提出来作为减少代码重复的解决方案:try{CodeThatMightThrow();}catch(...){ExceptionHandler();}voidExceptionHandler(){try{throw;}catch(FileException*e){//dohandlingwithsomecomplexlogicdeletee;}catch(GenericException*e){//dohandlingwitho
我的应用程序在初始化时崩溃的测试仪出现问题。我添加了更多的日志记录和异常处理,但它仍然崩溃并显示通用的“此程序已停止工作”消息,而不是触发我的错误处理。鉴于我的main()看起来像这样并且有catch(...)在什么情况下不会触发?try{simed::CArmAppapp(0,cmd);for(booldone=false;!done;){done=!app.frame();}}catch(conststd::runtime_error&e){handleApplicationError(e.what());return-1;}catch(...){handleApplication
令人惊讶的是,我无法通过谷歌搜索和搜索SO找到答案(关于SO有很多类似的问题,但与其他语言相关)。我怀疑答案是否。如果是这样,就会有明显的不便,例如try{std::stringfname=constructFileName();//canthrowMyExceptionofstreamf;f.exceptions(ofstream::failbit|ofstream::badbit);f.open(fname.c_str());//...}catch(ofstream::failure&e){cout如果我的假设是正确的,你会如何处理?通过将std::stringfname;移出tr
请注意,此函数没有“{”和“}”主体。只是一个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