不可修补的自定义异常C++
Uncatchable custom exception C++
这整晚都让我抓狂。
class ExceptionImpl;
/**
* Custom Exception.
*/
class Exception : public virtual std::exception
{
public:
Exception( const Exception& original );
Exception( const std::string& message );
virtual ~Exception( void ) throw( );
virtual const char* what( void ) const throw( );
private:
const std::unique_ptr< ExceptionImpl > m_pimpl;
};
我从库中抛出这个自定义异常,如下所示
throw Exception( "Error message" );
并通过捕获
try
{
regex pattern(R"(a*)");
Id::set_pattern_validator(pattern);
assert(false);
}
catch( Exception const& exception )
{
assert(true);
}
Id::set_pattern_validator
是库的Id类中的一个静态方法,也是异常的源。我已经尽我所能去捕捉这个异常,但没能捕捉到。
catch( Exception )
catch( std::exception )
catch( ... )
Nada!
终端输出如下。
"在抛出'Exception'what()的实例后调用Terminate:模式验证器一旦设置就不能更改。中止陷阱。"
现在,除了牺牲一只山羊,我不知道下一步该怎么做。。。有什么提示吗???
注意:如果我在main中抛出自定义异常,我可以毫无问题地捕获它。
Mac OS X环境使用GCC,支持C++0x。
EDIT:目前的解决方案是在基于linux的系统(Fedora)上继续开发。到目前为止,我还不会接受答案。谢谢大家的帮助
如果catch (...)
(在同一线程的封闭函数中)没有处理它,那么崩溃毕竟不是由抛出的异常引起的。
(注意:即使程序已经被捕获,也有可能抛出异常并终止程序。从析构函数抛出或违反throws
子句是发生这种情况的两种方式。)
如果您从main内部抛出自定义异常并能够捕获它,那么您必须在调用堆栈中的某个位置显示UB,这会导致后面的异常无法捕获。
我也遇到过类似的问题。
我在Mac OSX 10.8(Mountain Lion)上使用QT,使用gcc47(macports)。在QT main中,我从共享库中调用了一个方法,该方法抛出了该共享库中定义的异常。无论我在方法调用周围放置了什么样的try-catch(捕获异常、捕获基,甚至catch(…)),都会调用终止处理程序,这会导致我的程序中止。不可能发现异常情况。
首先,我在链接过程中尝试了-shared-libgcc选项。这不是问题所在,否则catch(…)条款就会起作用。
然后,我使用手工编写的makefile编写了一个没有QT的简单main,链接到共享库。这奏效了!
我得出的结论是,问题是由传递给gcc的选项的差异引起的(即QT/qmake生成的makefile和我手工编写的makefile之间的差异)。
经过一些二进制搜索,我发现以下选项导致了我的问题(在链接时):
-mmacosx-version-min=10.5
将其更改为以下内容后:
-mmacosx-version-min=10.6,
一切都按预期进行。
我不知道为什么将选项指定为10.6可以解决这个问题。对此有什么想法吗?
- C++ 中的自定义异常:在哪里定义它们?
- 我应该C++自定义异常代码放在哪里?
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 处理许多自定义异常的最佳方法是什么
- C++未显示自定义异常消息
- 自定义异常中的消息已损坏
- 为什么要创建自己的自定义异常类
- C++ 构造函数中的自定义异常抛出 ()
- JNI自定义异常具有多个参数
- 如何在抛出未处理的自定义异常后调用 what()?
- 无法创建两个从 std::logic_error 继承的自定义异常类
- 引发异常并直接结束程序的自定义异常处理
- 在C++中创建自定义异常
- G++ 自定义异常处理程序
- 自定义异常并不总是执行 what()
- 从boost::exception和std::runtime_error继承自定义异常类
- 添加到方法的 C++ 自定义异常会出错
- 在自定义异常中仍可访问(误报?
- 自定义异常类 C++
- 未捕获从std::异常派生的C++自定义异常