异常处理,无法理解:(

时间:2011-05-01 09:21:12

标签: c++ exception-handling

Hya推进了SO的用户,

首先,我是C ++的新手,所以请原谅我,如果我不清楚提问。我已经看到了异常处理的一个例子,但无法弄清楚这里发生了什么:(

http://codepaste.net/zqsrnj

enum ErrorCode {…}; // this is exception class
ErrorCode dispatcher() {
   try {
      throw; // what is thrown here in function?, if rethrow what is rethrown?
   }
   catch (std::bad_alloc&) {
      return ErrorCode_OutOfMemory;
   }
   catch (std::logic_error&) {
      return ErrorCode_LogicError;
   }
   catch (myownstdexcderivedclass&) {
      return ErrorCode_42;
   }
   catch(...) { // this will handle the above throw in try block of dispatcher
      return ErrorCode_UnknownWeWillAllDie;
   }
}

ErrorCode apifunc() {
   try {
      // foo() might throw anything
      foo();
   }
   catch(...) {
      // dispatcher rethrows the exception and does fine-grained handling
      return dispatcher();
   }
   return ErrorCode_Fine; // 
}

ErrorCode apifunc2() {
   try {
      // bar() might throw anything
      bar();
   }
   catch(...) {
      return dispatcher();
   }
   return ErrorCode_Fine;
}

任何人都可以逐行或整体地解释这一点,这里发生了什么,控制是如何流动的?非常感谢任何帮助,非常感谢。

2 个答案:

答案 0 :(得分:2)

apifunc()apifunc2()使用dispatcher()函数将异常转换为错误代码。

基本上,发生的情况如下: apifunc()(以及类似apifunc2())尝试调用函数foo()。如果foo()抛出异常,则catch块将调用dispatcher()以获取与异常对应的错误代码,然后返回该错误代码。如果foo()没有抛出,apifunc()会返回ErrorCode_Fine,表示没有错误。

dispatcher()通过重新抛出最后抛出的异常,即foo()抛出的异常来工作。然后dispatcher()检查使用catch块抛出了哪个异常,并返回正确的错误代码。例如,如果foo()抛出std::bad_alloc,那么将执行该catch-block并返回ErrorCode_OutOfMemory;

为什么会有人这样做?

异常不一定在不同的编译(编译器,编译器标志等)中是二进制兼容的,因此将异常转换为错误代码在模块边界上更容易移植。

答案 1 :(得分:1)

foo()在执行期间抛出异常时,异常会在apifunc()包装器中捕获,其catch子句调用dispatcher()方法。在那里重新抛出“当前”异常(这是throw方法中的空dispatcher()语句)并再次被捕获。然后是不同的catch子句(bad_alloc,logic_error,myownstdexcderivedclass ...返回一个特定的错误代码,而不是返回到外面的世界。

最后一个catch(...)子句确保不会向apifunc()的来电者抛出任何异常。