无法捕获的C++异常

30 篇文章 0 订阅

今天遇到一个奇怪的现象, 同一个程序在一台机器上运行能捕获代码抛出的c++异常,   在另外一台机器上无法捕获异常直接abort出来,


堆栈如下:


#0  0xf77c6430 in __kernel_vsyscall ()
#1  0x002b6df0 in raise () from /lib/libc.so.6
#2  0x002b8701 in abort () from /lib/libc.so.6
#3  0x00615acc in _Unwind_Resume () from /lib/libgcc_s.so.1
#4  0x086bacbb in XXXXXXXXXXXXXXXXX


经过gdb单步跟踪基本怀疑是运行库的兼容性问题,  分别检查两台机器的gcc/glibc/libstdc++版本, 果然发现了端倪。


没问题的机器:  ls -lt /lib/libgcc_s.so.1
lrwxrwxrwx. 1 root root 28 Oct 31 09:01 /lib/libgcc_s.so.1 -> libgcc_s-4.4.6-20120305.so.1


有问题的机器: ls -lt /lib/libgcc_s.so.1
lrwxrwxrwx 1 root root 28 Sep 11 08:29 /lib/libgcc_s.so.1 -> libgcc_s-4.1.2-20080825.so.1


在备份之后, 果断把libgcc_s-4.4.6-20120305.so.1拷贝到有问题的机器上没覆盖之。  
再试, 竟然没问题了。




UG(Unigraphics)是一个高级的计算机辅助设计、工程和制造软件套件,它主要用于产品设计、工程和制造行业。在UG中,异常处理通常涉及到软件开发过程中对C++代码的异常捕获和处理。 在C++中,异常处理是通过`try`、`catch`和`throw`语句来实现的。如果你需要在使用UG的过程中捕获C++异常,你可以采用以下步骤进行处理: 1. 使用`try`块将可能抛出异常的代码段包围起来。这样,当异常发生时,程序的执行流程会被转移到相应的`catch`块中。 2. 在`try`块后面跟随一个或多个`catch`块,每个`catch`块负责捕获一种类型的异常。你需要指定`catch`块能够处理的异常类型。 3. 使用`throw`语句在代码的某个地方抛出异常。当异常被抛出时,C++运行时会在`try`块外查找匹配的`catch`块。 4. 如果在`try`块中发生了异常,并且有相应的`catch`块能够捕获异常类型,那么控制流会进入该`catch`块进行处理。 5. 在`catch`块中,你可以进行异常处理逻辑,比如记录错误信息、清理资源、通知用户错误等。 6. 在所有的异常处理完成后,程序会继续从`catch`块之后的代码执行。 例如: ```cpp try { // 可能抛出异常的代码 if (somethingWrong) { throw std::runtime_error("An error has occurred."); } } catch (const std::runtime_error& e) { // 处理std::runtime_error类型的异常 std::cerr << "Caught a runtime_error: " << e.what() << std::endl; } catch (...) { // 处理所有其他类型的异常 std::cerr << "Caught some other kind of exception" << std::endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值