C ++处理未捕获的异常

时间:2013-11-24 17:36:38

标签: c++ exception-handling

大家好我所面临的一些困难是理解以下代码处理未捕获的异常,我对下面的例子有一些疑问。

1)只是想知道为什么输出是:“呼唤我的意外”和“抓住了坏的表达”而不是“呼唤我的意外”,“抓住了X”

2)throw(X,Y, bad_exception)在'void f()'函数中的含义。

3)typedef void (*pfv)();实际意味着什么

class X { };
class Y { };
class A { };

typedef void (*pfv)();

void my_terminate() {
  cout << "Call to my_terminate" << endl;
  abort();
}

void my_unexpected() {
  cout << "Call to my_unexpected" << endl;
  throw;
}

void f() throw(X,Y, bad_exception) {
  throw A();
}

void g() throw(X,Y) {
  throw A();
}
int main()
{
  pfv old_term = set_terminate(my_terminate);
  pfv old_unex = set_unexpected(my_unexpected);
  try {
    cout << "In first try block" << endl;
    f();
  }
  catch(X) {
    cout << "Caught X" << endl;
  }
  catch(Y) {
    cout << "Caught Y" << endl;
  }
  catch (bad_exception& e1) {
    cout << "Caught bad_exception" << endl;
  }
  catch (...) {
    cout << "Caught some exception" << endl;
  }
 }
抱歉提出了多个问题,希望有人能够以外行的方式向我解释。谢谢,并欣赏..

1 个答案:

答案 0 :(得分:2)

1)当您调用f时,它会抛出一个异常,其类型(A)不是其异常规范的一部分。这会导致调用已注册的意外处理程序,在本例中为my_unexpected。这将打印“调用my_unexpected”,然后重新抛出原始异常(如上所述,其类型不属于f的异常规范),这会导致bad_exception被抛出(但仅限于因为bad_exceptionf)的异常规范的一部分。然后将其记录在main中,并打印“Caught bad_exception”。

2)这意味着“f可能会抛出XYbad_exception,如果它尝试抛出任何其他内容,那么意外的处理程序将是称为”。

3)这意味着“pfv是指向不带参数且具有void返回类型的函数的指针的类型”。因此pfv old_term;表示old_term是一个这样的函数指针。


这是一个有用的链接,值得:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr162.htm

特别相关的位在底部,它表示(强调我的):

  

如果unexpected()没有抛出(或重新抛出)一个允许的对象   f()的异常规范,然后C ++运行时执行两个之一   事情:

     
      
  • 如果f()的异常规范包含类std :: bad_exception,则unexpected()将抛出一个类型的对象   std :: bad_exception,C ++运行时将搜索另一个   处理f()的处理程序。
  •   
  • 如果f()的异常规范不包含类std :: bad_exception,则调用函数terminate()。
  •