不可捕获的自定义异常C++

7
这让我整晚都感到很疯狂。
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!

终端输出如下:
“Terminate called after throwing an instance of 'Exception' what(): The pattern validator cannot be altered once set. Abort trap.”
现在除了献祭山羊,我不知道该尝试什么了...有什么提示/建议吗?
注意:如果我在主函数中抛出自定义异常,就可以轻松捕获它。
使用带有C++0x支持的GCC的Mac OS X环境。
编辑:目前的解决方案是在基于Linux的系统(Fedora)上继续开发。我暂时不会接受答案。 感谢大家的帮助。

当你说“形成一个库”时,是否意味着跨DLL边界?如果是这种情况,那么这是不被鼓励的。 - Gregory Pakosz
2
@Cat:实际上,对于异常使用pimpl是推荐的,否则在复制时可能会得到std::terminate。std::bad_alloc肯定更好。编辑:Boost.Exception使用pimpl。 - Yakov Galka
我尝试过抛出std::exception和std::runtime_error。但是没有用。它无法被捕获? - Ben Crowhurst
@Cat Plus Plus:为了完整性,我仍然应用了您的评论,但它没有产生影响。现已恢复。 - Ben Crowhurst
@BenCrowhurst:你尝试过在调试器下逐步执行代码吗? - Cat Plus Plus
显示剩余5条评论
3个回答

7
如果同一线程中的封闭函数没有处理它,那么你的崩溃并不是由于未捕获的异常造成的(在此之前)。
(注意:有可能抛出异常并终止程序,即使它本来会被捕获。从析构函数中抛出或违反throws子句是发生这种情况的两种方式之一。)

哦,终端输出如下。在抛出“异常”的实例后终止调用。 what(): 一旦设置,模式验证器就无法更改。 中止陷阱。好的,我会从不同的角度开始查看它。 - Ben Crowhurst
不,这个例子中没有涉及到线程。而且你提出的其他建议也不是原因。 - Ben Crowhurst
2
最好去找那只山羊。 - Hans Passant

1
如果你在 main 函数中抛出自定义异常并且可以捕获它,那么你一定在调用栈的某个地方表现出了未定义行为,导致后面的异常没有被捕获。

0

我遇到了类似的问题。

我在Mac OSX 10.8(Mountain Lion)上使用gcc47(macports)使用QT。在QT main中,我调用了从共享库中定义的抛出异常的方法。无论我在方法调用周围放置了什么样的try-catch(捕获异常,捕获基础,甚至是catch(...)),终止处理程序总是被调用,导致我的程序中止。无法捕获异常。

首先,我尝试使用-shared-libgcc选项进行链接。否则,catch(...)子句会起作用。

然后,我编写了一个简单的main,不使用QT,而是使用手写的makefile链接到共享库中。那行得通!

我得出结论,问题是由于传递给gcc的选项的差异引起的(即QT / qmake生成的makefile和我手写的makefile之间的区别)。

经过一些二进制搜索,我发现以下选项正在造成问题(在链接时):

-mmacosx-version-min=10.5

将其更改为以下内容:

-mmacosx-version-min=10.6,

一切都按预期运行。

我不知道为什么指定选项为10.6会解决这个问题。对此有什么想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接