我有以下例外情况。
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()
中ChildException
条BaseException
抛出throw_it()
?
假设出于此问题的目的,ChildException
可能会抛出FooException
或class 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}}
答案 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
希望有所帮助。