无法捕获的自定义异常C ++

时间:2011-06-25 12:38:15

标签: c++ macos shared-libraries custom-exceptions

这一直让我疯狂。

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():一旦设置,模式验证器就无法更改。中止陷阱。”

现在没有牺牲一只山羊我不知道接下来会尝试什么......任何提示/提示???

注意:如果我在main中抛出自定义异常,我可以捕获它没问题。

使用GCC并支持C ++ 0x的Mac OS X环境。

编辑:现在的解决方案是继续在基于Linux的系统(Fedora)上进行开发。我现在还不会接受答案。 感谢大家的帮助。

3 个答案:

答案 0 :(得分:6)

如果catch (...)(在同一个线程中的一个封闭函数中)没有处理它,那么你的崩溃不是由抛出引起的一个未捕获的异常引起的。

(注意:有可能抛出异常并终止程序,即使它已被捕获。从​​析构函数中抛出或违反throws子句有两种方法可以实现。)

答案 1 :(得分:0)

如果从main内部抛出自定义异常并且可以捕获它,那么你必须在调用堆栈中的某个地方展示UB,这导致后来的异常没有被捕获。

答案 2 :(得分:0)

我有类似的问题。

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

首先,我在链接期间尝试了-shared-libgcc选项。这不是问题,否则catch(...)条款就可以了。

然后我使用手写的makefile编写了一个没有QT的简单main,链接到共享库。这很有效!

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

经过一些二进制搜索后,我发现以下选项导致了我的问题(链接时):

-mmacosx-version-min=10.5

将其更改为以下内容后:

-mmacosx-version-min=10.6,

一切都按预期工作。

我不知道为什么指定10.6的选项可以解决问题。有什么想法吗?