在我的应用程序中我使用不同的开源库,引发了不同的异常。 我没有处理异常处理的经验,当我知道时,我总是只做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:
答案 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 stdexcept
和exception
。
希望这会有所帮助。
答案 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
}