2012-02-29 24 views
1

在我的应用程序中使用不同的开源库,引发了不同的异常。 我没有处理异常处理方面的经验,我总是做了try/catch事情,当我知道
有问题。 现在我喜欢构建一些处理其中所有异常的对象。我没有知道如何开始,即使它可能
例如,我有我的类和B类C++如何处理泛型异常对象的所有类型的异常?

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); 
} 
}; 

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

UPDATE:
努力的建议提出,并在主我的应用程序的实现的try/catch后,问题就永远不会有异常时抛出的所有IM得到的是这一点,但它从来没有得到的试/ catch:
visual studio run time error

+1

这个错误发生是因为一个叫assert()的指令。这个结构会在它的括号之间获得一个有条件的表达式,并且如果它变成假,它会中止执行并显示你所看到的对话框。 – Baltasarq 2012-02-29 11:18:17

回答

2

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

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); 
} 

记住,你需要#包括stdexceptexception。 希望这有助于。

+0

究竟什么是异常类的像这个链接的好处: http://www.cplusplus.com/doc/tutorial/exceptions/ – user63898 2012-02-29 08:56:27

+0

你给出该链接使用异常的基础知识。首先,它引入了任何可以作为异常抛出,然后从标准库中的异常层次开始。使用异常类而不是数字字符串的好处正是您可以区分抛出的异常类中的所有类型的错误。 – Baltasarq 2012-02-29 11:21:05

1

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

try 
{ 

} 
catch(...) 
{ 

} 

但是,请注意使用包罗万象的是一个糟糕的设计,它隐藏了您的问题,相反,您应该专门处理每个例外情况并采取适当的措施。

+1

解答由最后的评论保存! :) – Nim 2012-02-29 08:44:35

0

您可以使用try/catch,捕捉所有异常:

try 
{ 

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

} 
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 
} 
相关问题