【发布时间】:2021-05-18 04:27:49
【问题描述】:
我有一些看起来像这样的例外
class ExceptionType1Base : public std::runtime_error {
};
class ExceptionType1Derived1 : public ExceptionType1Base {
};
class ExceptionType1Derived2 : public ExceptionType1Base {
};
还有另一种异常类型
class ExceptionType2Base : public std::runtime_error {
public:
int type;
};
class ExceptionType2Derived1 : public ExceptionType2Base {
ExceptionType2Derived1() {
type = 1;
}
};
class ExceptionType2Derived2 : public ExceptionType2Base {
ExceptionType2Derived2() {
type = 2;
}
};
我想在捕获时将一种异常类型转换为另一种类型,例如
ExceptionType1Base convertToType1Exception(ExceptionType2Base& ex) {
if(ex.type == 1) {
return ExceptionType1Derived1();
}
return ExceptionType1Derived2();
}
然后当我捕获异常时,它会像
try {
... some code ....
} catch (const ExceptionType2Base& ex) {
throw convertToType1Exception(ex);
}
问题是我丢失了转换后异常的派生类型,而最终抛出的异常是 ExceptionType1Base,有更好的处理方法吗?我想过使用宏进行异常类型转换,但我想知道是否有更好的方法。
【问题讨论】:
-
ExceptionType1Base convertToType1Exception()-> 请寻找对象切片。你的函数convertToType1Exception()总是返回一个ExceptionType1Base的实例。 (隐式转换发生在每个returns 中。因此,除了ExceptionType1Base之外,您永远无法捕捉到其他东西。 -
您正在寻找两个对象之间的一对一映射。我认为即使使用模板,您也无法在逻辑上确定函数的返回类型(在这里满足您的要求)。您可以在单独的 catch 块中捕获两个 type1 对象并抛出相应的 type2 对象。只要您没有大量此类映射,这应该可以扩展。
-
感谢您提供详细信息。所以如果我想实现这样的用例。想象一下 10 个不同的异常,这个方法需要在很多地方调用。你将如何实现它?
-
@MikeLoury 检查此onlinegdb.com/iz0dtRp5n