c ++如何处理泛型异常对象的所有类型的异常?

时间:2012-02-29 08:41:21

标签: c++ exception-handling

在我的应用程序中我使用不同的开源库,引发了不同的异常。 我没有处理异常处理的经验,当我知道时,我总是只做try / catch事情 有问题。 现在我想构建一种处理其中所有异常的对象。我不知道如何开始,即使有可能 例如,我有我的A和B类

Class A 
{
 void method1() 
{
  Foo foo = new foo // external lib throws throw std::bad_alloc();
}
};

Class B 
{
 Void method1() 
{
  Int d = m_foo[0] // external lib  throw std::runtime_error( message );
}
};

我想以某种方式在我的应用程序中处理这些类型和其他位置 我应该采用什么策略?

更新:
在尝试了提供的建议并在我的应用程序的主要部分中实现了try / catch之后,当异常抛出所有即时通讯时,它永远不会到达的问题是这个,但它永远不会到达try / catch:
visual studio run time error

4 个答案:

答案 0 :(得分:2)

您可以在try... catch功能中使用main()结构。 C ++标准库的所有例外都来自std::exception,因此这是一个很好的备份。但是,您应该区分所有不同类型的异常,或者至少区分那些更常见的异常。您还可以创建自己的异常,作为从std::runtime_error派生的类。您可以拥有多个 catch 部分,但是从一个更具体的部分订购到更一般的部分。

try {

// more things...

}
catch(const std::bad_alloc &ba)
{
    // memory error
    std::cerr << "Memory error" << std::endl;
    exit( EXIT_FAILURE );
}
catch(const std::runtime_error &re)
{
    // customized error, probably
    std::cerr << "ERROR: " << re.what() << std::endl;
    exit( EXIT_FAILURE );
}
catch(const std::exception &e)
{
    // general (unexpected) error
    std::cerr << "Unexpected ERROR: " << e.what() << std::endl;
    exit( EXIT_FAILURE );
}

请记住,您需要#include stdexceptexception。 希望这会有所帮助。

答案 1 :(得分:1)

使用catch all / default异常处理程序 如果使用省略号(...)作为catch的参数,该处理程序将捕获任何异常:

try
{

}
catch(...)
{

}

但是,请注意,使用catch all是一个糟糕的设计并且它隐藏了您的问题,而是您应该专门处理每个异常并为每个异常采取适当的操作。

答案 2 :(得分:0)

您可以使用捕捉所有例外情况的try/catch

try
{

}
catch (...) //catches all exceptions
{

}

答案 3 :(得分:0)

通常你会使用与

类似的东西
#include <stdexcept>
try {
   ...
} catch (std::exception const& e) {
  // catches std::exception and derived, e.what() can be used to log the root cause
} catch (...) {
  // catches anything thrown, not only exceptions
}