如果要重新抛出默认功能,为什么要使用默认异常捕获?

时间:2017-04-27 06:05:27

标签: c++ exception error-handling

在函数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;
}

为什么需要默认捕获?

3 个答案:

答案 0 :(得分:0)

默认捕获器用于捕获未显式处理的每个异常。 在这种情况下,您可以确定可以抛出哪些异常,并且默认捕手有点偏执。 但是,假设您想要捕获一个异常类型来执行特定的操作,并且您希望为所有其他情况执行相同的处理程序,默认处理程序会阻止重复!

答案 1 :(得分:0)

你在这里做的是你捕获了一个异常,这个异常没有被之前的catch语句所捕获,但你进一步抛出它以便它可以被别处捕获。它的工作方式与catch(...)语句不存在的情况相同,因为如果不存在,则正常catch未捕获的异常会更高到另一个try块(来自g()f()main()),直到它被处理(在您的情况下,它在main中处理)。如果没有catch来处理异常,那么系统会接管它。

请注意,throw中的catch(...)例外是默认行为。这是您通过添加throw在代码中实现的内容。如果你做了,例如cout << "..."然后与没有catch(...)相比,它的工作方式会有所不同,在这种情况下,异常将由f()处理,然后由main()处理

答案 2 :(得分:0)

对我来说问题不清楚,可以用两种方式解释:

为什么存在默认的catch机制:其他答案给出了有意义的答案。

为什么g有一个默认catchthrow;,我看到两种可能性:它记录了其他异常,并且更容易调试这种情况(通过把断点放在上面。)