在函数g()中,注释行LABEL(默认处理程序)产生与它相同的输出。为什么我们有默认捕获?
#include <iostream>
#include <exception>
using namespace std;
void h() {
//throw 1; //A
//throw 2.5; //B
throw 'a'; //C
//throw "add"; //D
}
void g() {
try {
h();
}
catch (int) { cout << "int"; }
catch (double) { cout << "double"; }
catch (...) { throw; } //LABEL - commenting this line gives same result
}
void f() {
try {
g();
}
catch (char) { cout << "Char"; }
catch (...) { throw; }
}
int main() { //main func
try {
f();
}
catch (...) { cout << "Unknown"; }
return 0;
}
为什么需要默认捕获?
答案 0 :(得分:0)
默认捕获器用于捕获未显式处理的每个异常。 在这种情况下,您可以确定可以抛出哪些异常,并且默认捕手有点偏执。 但是,假设您想要捕获一个异常类型来执行特定的操作,并且您希望为所有其他情况执行相同的处理程序,默认处理程序会阻止重复!
答案 1 :(得分:0)
你在这里做的是你捕获了一个异常,这个异常没有被之前的catch
语句所捕获,但你进一步抛出它以便它可以被别处捕获。它的工作方式与catch(...)
语句不存在的情况相同,因为如果不存在,则正常catch
未捕获的异常会更高到另一个try
块(来自g()
到f()
到main()
),直到它被处理(在您的情况下,它在main
中处理)。如果没有catch
来处理异常,那么系统会接管它。
请注意,throw
中的catch(...)
例外是非默认行为。这是您通过添加throw
在代码中实现的内容。如果你做了,例如cout << "..."
然后与没有catch(...)
相比,它的工作方式会有所不同,在这种情况下,异常将由f()
处理,然后由main()
处理
答案 2 :(得分:0)
对我来说问题不清楚,可以用两种方式解释:
为什么存在默认的catch机制:其他答案给出了有意义的答案。
为什么g
有一个默认catch
和throw;
,我看到两种可能性:它记录了其他异常,并且更容易调试这种情况(通过把断点放在上面。)