我正试着登上屏幕: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;
}
答案 0 :(得分:4)
阅读有关C ++ 11的more。花几天时间阅读Programming in C++
上的好书这个try
...catch
block解释说明了
当复合语句中的任何语句抛出类型E的异常时,它将与handler-seq中每个catch子句的形式参数T的类型匹配,按顺序其中列出了catch子句。
因此您可能希望通过首先放置最常见的异常来订购catch
块(但实际上,只要catch
之间没有重叠,顺序就没那么重要了。 ..;如果存在重叠,则首先放置最精确的catch
子句。
由于在<stdexcept>
中std::logic_error
是std::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
}