C ++ catch base异常,抛出child

时间:2013-11-27 13:06:24

标签: c++ exception-handling

我有以下例外情况。

class BaseException  : public Exception     {};
class ChildException : public BaseException {};
class FooException   : public BaseException {};

int throw_it() {
  try {
    throw ChildException();
  } catch(BaseException& exc) {
    throw exc;
  }
}

即使我抓住了catch,有没有办法让throw_it()ChildExceptionBaseException抛出throw_it()

假设出于此问题的目的,ChildException可能会抛出FooExceptionclass BaseException : public Exception {}; class AException : public Exception {}; class BException : public Exception {}; class CException : public Exception {}; class DException : public Exception {}; class EException : public Exception {}; class FException : public Exception {}; class GException : public Exception {}; void throw_it() { try { // Code } catch(AException exc) { log(exc); throw(exc); } catch(BException exc) { log(exc); throw(exc); } catch(CException exc) { log(exc); throw(exc); } catch(DException exc) { log(exc); throw(exc); } catch(EException exc) { log(exc); throw(exc); } catch(FException exc) { log(exc); throw(exc); } catch(GException exc) { log(exc); throw(exc); } } ,而我在编译时不知道哪一个。

修改

这可能是我问题的一个更完整的例子。

void throw_it() {
  try {
    // Code
  } catch(BaseException exc) {
    log(exc);
    throw(exc);
  }
}

我想这样写:

{{1}}

2 个答案:

答案 0 :(得分:2)

catch(BaseException& exc) {
  throw; // thows excact expeption
}

搜索“throw;”在页面http://www.cplusplus.com/doc/tutorial/exceptions/

答案 1 :(得分:1)

施法是一种方法。但我认为这不是一个好主意。

真正的问题是,你为什么要这样做?

如果您想重新抛出异常,无论其类型如何,只需将其重新抛出为:

catch(BaseException const & e)
{
     log(e);
     throw; //it rethrows the exception irrespective of its type!
}

那应该有用。神奇发生在throw - 由于异常被引用捕获,它将抛出派生类型的异常,意味着异常是ChildException,然后是{{1即使捕获提及throw,也会抛出ChildException,而不是BaseException


如果您想重新抛出特定的异常(而不是全部),那么首先按特定类型捕获它:

BaseException

希望有所帮助。