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!

终端输出如下。

“在抛出 'Exception' what() 的实例后调用终止:模式验证器一旦设置就无法更改。中止陷阱。”

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

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

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

编辑:目前的解决方案是继续在基于 linux 的系统(Fedora)上进行开发。到目前为止,我不会接受答案。感谢大家的帮助。

4

3 回答 3

7

如果catch (...)(在同一线程中的封闭函数中)不处理它,那么您的崩溃毕竟不是由引发的未捕获异常引起的。

(注意:有可能抛出异常并终止程序,即使它已被捕获。从​​析构函数中抛出或违反throws子句是发生这种情况的两种方式。)

于 2011-06-25T12:47:02.567 回答
1

如果您从 main 内部抛出自定义异常并且可以捕获它,那么您必须在调用堆栈中的某处展示 UB,这会导致后面的异常未被捕获。

于 2011-06-25T14:12:29.597 回答
0

我有类似的问题。

我使用 gcc47 (macports) 在 Mac OSX 10.8 (Mountain Lion) 上使用 QT。在 QT 主程序中,我从共享库中调用了一个方法,该方法引发了在该共享库中定义的异常。无论我在方法调用周围放置了什么样的 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 可以解决问题。对此有什么想法吗?

于 2013-01-31T22:05:35.807 回答