程序在异常后不会停止
Program doesn't stop after exception
我在 Ubuntu 12.04 中使用 eclipse。我在程序中使用了一些异常,当它们被捕获时,它会正确地给我 cout。但该计划一直持续到最后。有没有办法在异常后停止程序?
这是我正在使用的代码:
try{
if(BLER==-1) throw 12;
}catch(int exception){
cout << "ERROR: BLER value is invalid for x= " << x << ", BLER_input= " << BLER_input << ", m= "<< m << endl;
}
一些解决方案:
-
如果你在 main() 例程中执行此操作,请使用函数中的
return
(并根据返回值执行此操作) -
使用
exit(n)
其中 n 是退出代码 (http://www.cplusplus.com/reference/cstdlib/exit/) -
abort()
这是否是一个关键问题(http://www.cplusplus.com/reference/cstdlib/abort/)
注意:正如 James Kanze 所指出的,exit
和 abort
不会调用本地对象的析构函数。这是值得注意的,因为您正在处理类。
如果你可以/必须处理当前函数中的问题,你可以(并且应该)在那里终止:
#include <iostream>
#include <cstdlib>
if ( BLER == -1 )
{
std::cout << "BLER value is invalid." << std::endl;
std::exit( EXIT_FAILURE );
}
当您遇到错误条件但不知道如何正确处理它时,将引发异常。在这种情况下,您抛出一个异常而不是整数,可以选择指示其构造函数中遇到的问题......
#include <stdexcept>
if ( BLER == -1 )
{
throw std::runtime_exception( "BLER value is invalid" );
}
。并在调用树的某个地方捕获它,在那里你可以给出一个更好的错误消息,可以处理问题,重新抛出,或者根据你的选择终止)。默认情况下,只有在根本没有捕获程序的情况下,异常才会终止程序("未处理的异常");这就是构造的整个想法。
抛出一个整数并在同一函数中捕获它是 (ab-) 使用异常作为函数内goto
。
使用函数 exit: exit(1);
,其中 1 是退出代码(通常非零表示错误)。如果将异常视为严重错误,也可以使用 abort()
。
要在捕获异常后停止程序的执行,只需在catch
块中调用std::exit()
:
#include <cstdlib>
#include <iostream>
int main()
try
{
throw 42;
}
catch(int i)
{
std::cout << "Caught int: " << i << ". Exiting...n";
std::exit(EXIT_FAILURE);
}
现场演示在这里。
这也适用于main
之外。您可以将EXIT_FAILURE
替换为所需的任何int
值,可在0-255
范围内移植。
尝试像这样使用 return 命令
return 0 //for successful termination or your preffered int status returned
//or just
return;
//or (C++)
[std::exit]
C++ 中的catch
处理程序允许在代码的正常执行路径之外处理错误。处理后,C++假定恢复正常操作或程序是安全的。
如果不是这种情况,假设您只想记录错误,您可以自由地重新throw
导致错误进一步向上传播的异常。
如果根本没有捕获异常,则将调用C++函数std::terminate
。默认行为是调用abort
。
对你来说,最好的办法可能是通过在 catch 块的末尾调用 throw
来重新抛出 exeception。
- 为什么异常不退出程序?
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 在C++程序中使用的迭代器中未处理的异常
- 与异常处理程序中的操作员<<不匹配
- 捕获异常后如何退出程序执行
- 捕获全部处理程序检测C++中的子类异常
- 数组 C++ 上的异常处理程序
- SDL_Image库会使程序崩溃或使其行为异常
- 从终止处理程序访问所有未捕获的异常
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 从处理程序捕获时如何获取 Ada 异常消息C++?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- C++ 未捕获异常,程序将终止并中止
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 如何处理异步函数中的异常UWP应用程序getFileFrompathAsync(path);
- 未处理异常- c++程序在强制转换时停止