C++ 形状库异常处理

标签 c++ c++11

我想编写某种“形状库”程序。

为了不写太多代码,假设我们只有一个抽象基类 Shape 和一些派生类,例如 Line、Rectangle 和 Circle(我认为描述它们不是那么重要)。

考虑到主要功能将是这样的:

int main() {

    Shape *rect = new Rectangle(Pixel(25, 10), Pixel(33, 15));
    Shape *line = new Line(Pixel(1, 12), Pixel(23, 12));
    Shape *circle = new Circle(Pixel(37, 12), 2);
    refresh_shapes(); // just draw every created shape
    cin.get();

    rect->rotate_left();
    refresh_shapes();
    cin.get();

    rect->move(45, 12);
    refresh_shapes();
    cin.get();

    line->up(rect); // place the line right above the rect
    refresh_shapes();
    cin.get();

    circle->down();
    refresh_shapes();
    cin.get();

    return 0;
}

我应该如何处理可能在构造函数中或可能在移动后抛出的异常(如果形状超出屏幕边界)?

例如,如果我将整个代码包装在一个 try-catch block 中,我将在屏幕上看到在抛出异常之前发生的所有事情。但是我想尽可能地“保存”。有没有比在 try-catch block 中包装几乎每一行更好的解决方案?

抱歉打扰了,只是想了解它是如何工作的。

最佳答案

不要为琐碎的故障抛出异常,这些故障并非异常,但预计会作为使用对象的常规功能发生。

界线在哪里是判断的问题。我们中的一些人仍在学习它!

创建对象时,如果内存不足,则会引发异常,因为所有 future 的分配也可能会失败。但是,当对象不在屏幕区域时,您可能无法显示它。

需要在针对真正的异常错误(在本地不可恢复)抛出异常与作为预期行为的一部分并可立即从中恢复的常规故障之间取得平衡。

这样一来,您就不会用 try/catch 结束每次调用,而且我们也不需要在每次调用函数时都检查所有可能的错误。

关于C++ 形状库异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36861687/

相关文章:

c++ - 谁能告诉我为什么显示 "runtime error"?

c++ - 将值从叶传播到根

c++ - 未更改的 C++ 文件的目标代码在重新编译时发生更改的可能原因是什么?

c++ - 我可以在成员初始化列表中使用 std::minmax_element 吗?

c++ - 打印 C++ 字符串数组的首字母

c++ - 创建 Qml/C++ 应用程序作为插件

c++ - 字符串参数 const char* 和 const wchar_t*

c++ - std::async 使用绑定(bind)到 lambda 的右值引用

c++ - 显式原子加载/存储与通常的 operator= 和 operator T 有什么区别?

c++ - 为什么 `std::pair` 将 `std::tuple` 作为 ctor 参数类型而不是 `const std::tuple&`?