gpt4 book ai didi

c++ - 您能否将一个异常继承层次结构包装到另一个异常继承层次结构中? --或者,另一种干净的方法来处理这个问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:53 24 4
gpt4 key购买 nike

假设我在 C++ 中处理两个继承层次结构。一个继承自 std::exception(新层次结构),另一个继承自 Exception(遗留 C++ Builder VCL 基异常类)。如果我调用可能抛出任何一种异常的代码,我必须编写如下代码:

try {
// do stuff....
Function1();
Function2();
} catch (std::exception &ex) {
std::cout << "STL exception caught: " << ex.what() << std::endl;
} catch (Exception &ex) {
std::cout << "Legacy exception caught: " << ex.Message.c_str() << std::endl;
} catch (SomeOtherVendorLibraryException &ex) {
// etc.
}

问题是每个调用者都需要所有这些 catch 子句来尝试获取每一种最后类型的异常,因为 C++ 没有一个真正的强制异常基类,您可以将其用作万能的(例如 C# 中的 System.Exception 类)。 (catch (...) 是一个非启动器,因为您没有办法知道您捕获了什么,并且一些危险的系统异常,如访问冲突,也可能被捕获最好不要被困住。)

我想将这些“遗留”异常包装到 std::exception 层次结构中的一个类中。这种将第三方异常包装到您自己的异常系统中的概念并非完全没有先例。例如,.NET Framework 包装了其他系统中的大量错误(例如 COMException)。理想情况下,我希望看到这样的内容:

class LegacyException : public std::runtime_error {
public:
// construct STL exception from legacy exception
LegacyException(const Exception &ex) : std::runtime_error(ex.Message.c_str()) {}
};

try {
// In reality, this throw will happen in some function we have no control over.
throw Exception("Throwing legacy exception!");
} catch (std::exception &ex) {
// Ideally, the compiler would use the LegacyException constructor
// to cast the thrown Exception to a LegacyException, which ultimately
// inherits from std::exception.
std::cout << ex.what() << std::endl;
}

可以理解,异常永远不会被捕获 - 它会要求编译器使用相当多的魔法来捕获它。

是否有可能与上述类似的解决方案来包装遗留异常并实现这些目标?

  • 一个“catch”子句或类似子句,这样一般的异常处理逻辑只需编写一次。
  • 从一种异常类型转换为另一种异常类型的逻辑必须集中。
  • 尽可能避免使用宏。
  • 不使用 lambda 函数。

最佳答案

在使用 BC++Builder 时我遇到了同样的问题,宏似乎是当时唯一的解决方案。

“更干净”(嗯...)解决方案可能是“双重 try-catch”:内部 try-catch 将遗留异常转换为标准类,而外部 try-catch 实际处理异常。

我手头没有代码(已经好几年了),但基本上可以归结为:

#define DTRY  try { try
#define DCATCH catch (Exception& e) { throw LegacyException(e); } } catch

DTRY {
...
}
DCATCH(std::exception& e) {
// handle the exception
}

是的,我知道它很丑,但是当我在 Borland 工作时,我没有找到更好的东西。事实上,当时 Borland 非常不标准,我不知道它是如何演变的,也许现在你可以做得更好。希望这有帮助。

关于c++ - 您能否将一个异常继承层次结构包装到另一个异常继承层次结构中? --或者,另一种干净的方法来处理这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com