如何在这个try-throw-catch代码中订购异常?

时间:2015-12-10 08:23:42

标签: c++

我正试着登上屏幕:1,2,3,4,5,6,7,但我不知道如何订购我的程序中的catch。是否可以通过订购捕获量获得此输出?你能解释它是如何工作的吗?我在很多论坛上搜索过,但我一无所获。非常感谢你。

#include <exception>
#include <string>
#include <iostream>
using namespace std;
class My_Exception : public exception {};
class something {};
void func1() { cout << "1" << endl; throw exception(" no t h ing "); }
void func2() { cout << "2" << endl; throw string(" 12345 "); }
void func3() { cout << "3" << endl; throw out_of_range(" abcde "); }
void func4() { cout << "4" << endl; throw ios::failure(" i o s "); }
void func5() { cout << "5" << endl; throw My_Exception(); }
void func6() { cout << "6" << endl; throw something(); }
void func7() { cout << "7" << endl; throw logic_error(" t r u e "); }
int main() {
try {
func1(); func2(); func3();
func4(); func5(); func6();
func7();
}
catch (My_Exception) {/*1*/ }
catch (exception) {/*2*/ }
catch (logic_error) {/*3*/ }
catch (string) {/*4*/ }
catch (...) {/*5*/ }
catch (out_of_range) {/*6*/ }
catch (ios::failure) {/*7*/ }
catch (something) {/*8*/ }
return 0;
}

2 个答案:

答案 0 :(得分:4)

阅读有关C ++ 11的more。花几天时间阅读Programming in C++

上的好书

这个try...catch block解释说明了

  

当复合语句中的任何语句抛出类型E的异常时,它将与handler-seq中每个catch子句的形式参数T的类型匹配,按顺序其中列出了catch子句。

因此您可能希望通过首先放置最常见的异常来订购catch块(但实际上,只要catch之间没有重叠,顺序就没那么重要了。 ..;如果存在重叠,则首先放置最精确的catch子句。

由于在<stdexcept>std::logic_errorstd::exception的子类,您应该在catch(logic_error)之前放置catch(exception)(更精确)(不太精确但重叠)捉)

答案 1 :(得分:1)

当您抛出异常时,try块中的代码将结束其执行。程序执行相应的catch块,然后继续执行之后的行。只有在抛出异常后才会执行catch块。

如果要在捕获异常后继续执行,则应使用多个try块。以下代码打印1和2.

void func1() { cout << "1" << endl; throw exception(" no t h ing "); }
void func2() { cout << "2" << endl; throw string(" 12345 "); }
try{
    func1();
    cout << "this is not printed" << endl;
}
catch(exception){
    // This is executed after throw
}
catch(string){
    // This is not executed
}

try{
    func2();
}
catch(exception){
    // This is not executed
}
catch(string){
    // This is executed after throw
}