基类未捕获 C++ 派生类异常
Posted
技术标签:
【中文标题】基类未捕获 C++ 派生类异常【英文标题】:C++ derived class exception not caught with base class 【发布时间】:2012-02-13 17:50:06 【问题描述】:在我希望它们被捕获的情况下,异常不会被捕获。该代码位于 1 个 cpp 文件中的 1 个函数中,该文件由 GCC 4.2 编译为静态库,然后链接到 Cocoa 应用程序中。有问题的代码是
class runtime_error : public exception
// More code
;
int foo( void )
try
if( x == 0 )
throw std::runtime_error( "x is 0" );
catch( std::exception & e )
// I expect the exception to be caught here
catch( ... )
// But the exception is caught here
我可以修改代码为
int foo( void )
try
if( x == 0 )
throw std::runtime_error( "x is 0" );
catch( std::runtime_error & e )
// exception is now caught here
catch( … )
代码的第二个版本只解决了 runtime_error 异常的问题,而不是其他可能从 std::exception 派生的异常类。知道有什么问题吗? 请注意,代码的第一个版本在 Visual Studio 中运行良好。
谢谢,
巴里
【问题讨论】:
当你已经存在一个runtime_error
类时,你有什么理由定义你自己的类吗?
异常应该被捕获。 ideone.com/dl0Dm 更新您的 GCC 并查看错误是否仍然存在
您向我们展示的代码无法编译。请提供一个简短的、独立的完整示例。 sscce.org
关于 std::runtime_error 的定义有些混乱。我实际上并没有定义它。我只是表明它是从 std::exception 公开派生的,因此应该捕获异常。
我发现是第三方库导致了这个问题。如果我链接库(但不调用它的任何代码),则会出现问题。如果我不链接第 3 方库,则不会出现问题。知道如何链接第 3 方静态库会导致此问题吗?谢谢
【参考方案1】:
您的代码没有按照编写的方式编译。当我如下更改它以添加所需的包含、变量等时,它会按预期打印“异常”(g++ 4.2 和 4.5)。您能否向我们展示导致您的问题的完整真实代码?
#include <exception>
#include <stdexcept>
#include <iostream>
int x = 0;
int foo( void )
try
if( x == 0 )
throw std::runtime_error( "x is 0" );
catch( std::exception & e )
// I expect the exception to be caught here
std::cout << "exception" << std::endl;
catch( ... )
// But the exception is caught here
std::cout << "..." << std::endl;
return 0;
int main()
foo();
return 0;
【讨论】:
这是我刚刚测试过的一些代码,它以最初描述的方式运行和失败:#include "stdafx.h" int foo(void) try throw std::runtime_error("Error ");返回0; catch (std::exception &e) return 1; 捕捉 (...) 返回 1; 【参考方案2】:您的类runtime_error
是在您代码的命名空间中定义的类。我不确定您为什么要将它与std::
一起用作范围解析运算符?
throw std::runtime_error( "x is 0" );
这一行不应该改成throw runtime_error( "x is 0" );
吗?
【讨论】:
关于 std::runtime_error 的定义有些混乱。我实际上并没有定义它。我只是表明它是从 std::exception 公开派生的,因此应该捕获异常。以上是关于基类未捕获 C++ 派生类异常的主要内容,如果未能解决你的问题,请参考以下文章