这一直让我疯狂。
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)上进行开发。我现在还不会接受答案。 感谢大家的帮助。
答案 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的选项可以解决问题。有什么想法吗?