不同平台上的系统异常处理
System exception handling on different platforms
基本上,如何在mac/linux上捕获异常?也就是说,例外情况不是语言固有的,比如segfals&整数除法。在MSVC上编译时,__try__except是完美的,因为堆栈处理允许捕获异常并在堆栈的下层继续执行。
现在,我想将我的程序扩展到其他平台(主要是上面提到的平台),但我不知道异常处理在这些平台上是如何工作的。据我所知,它是通过posix信号处理的?因此,是否允许处理异常并继续降低堆栈?
编辑:这是有效的(伪代码)吗?在我看来,我正确地离开了C++块,因此不会沉迷于UB。
jmp_buf buffer;
template< typename func >
protected_code(func f) {
if(!setjmp(buffer) {
f();
}
else
{
throw std::exception("exception happened in f()"):
}
}
void sig_handler() {
longjmp(buffer);
}
int main() {
sigaction(sig_handler);
try {
protected_code( [&]
{
1/0;
}
);
}
catch(const std::exception & e) {
...
}
}
编辑2:哇,出于某种原因,我从未想过只从信号处理程序中抛出C++异常,那么就不需要使用longjmp/setjmp了。当然,它依赖于这样一个事实,即调用信号处理程序的线程是发生故障的同一堆栈和线程。这是在某个地方定义/保证的吗?代码示例:
void sig_handler(int arg) {
throw 4;
}
int main() {
signal(SIGFPE, sig_handler);
try {
int zero = 1;
zero--;
int ret = 1/zero;
} catch(int x) {
printf("catched %dn", x);
}
return 0;
}
在Unix中,您可以通过信号处理程序捕获处理器故障,使用sigaction
函数为要处理的signal
安装合适的处理程序。
(我想你指的是__try ... __except
而不是__try ... __catch
。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 不同平台上的系统异常处理