不可修补的自定义异常C++

Uncatchable custom exception C++

本文关键字:自定义异常 C++ 修补      更新时间:2023-10-16

这整晚都让我抓狂。

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可以解决这个问题。对此有什么想法吗?