C++:运算符重载和错误处理

mok*_*oka 5 c++ error-handling operator-overloading

我目前开始研究 C++ 中简单 2D 顶点类的运算符重载,其中位置应可通过 [] 运算符使用。这通常是有效的,但我真的不知道如何处理错误,例如如果运算符超出范围(在只有 x 和 y 值的 2D 顶点类的情况下,如果它大于一)

在这种情况下处理错误的常见方法是什么?

谢谢

gol*_*udo 3

即使在最好的情况下,错误处理也是一个棘手的问题。它几乎可以归结为错误有多大,以及当错误发生时预计会发生什么情况。

您可以遵循四种基本路径:

  1. 抛出异常
    • 错误处理的大锤。一个很棒的工具,需要的时候肯定想用,但一不小心就会搬起石头砸自己的脚。
    • throw本质上跳过了和 之间的所有内容catch,只留下死亡和毁灭。
    • 如果它没有被捕获,它将中止你的程序。
  2. 返回一个指示失败的值
    • 让程序员检查是否成功并做出相应的反应。
    • 失败值取决于类型。指针可以返回NULLor 0,STL 容器返回object.end(),否则可以使用未使用的值(例如-1or "")。
  3. 优雅地处理条件
    • 有时,错误并不是真正的错误,只是带来不便。
    • 如果仍然可以提供有用的结果,那么错误就可以很容易地被掩盖起来,而不会伤害任何人。
    • 例如,超出范围的错误可以只返回数组中的最后一个变量,而不需要诉诸任何混乱的异常内容。
    • 只要它是可预测定义的,程序员就可以按照自己的意愿进行处理。
  4. 未定义的行为
    • 嘿,程序员一开始就不应该给你错误的输入。让他们受苦吧。

一般来说,我只会在那些破坏程序的事情、那些我不希望在没有共同努力的情况下恢复的事情上诉诸选项一。否则,使用异常作为流量控制的一种形式并不比回到goto.

对于非程序破坏性错误,选项二可能是最常见的,但它的有效性实际上取决于您正在处理的返回类型。这是有利的,因为它允许程序员通过检测故障并自行恢复来本地控制流程。在处理重载运算符时,它的用途有限,但我认为为了完整起见我应该将其放入。

选项三是根据具体情况而定的。许多错误无法以这种方式处理,甚至可能导致不直观结果的错误。谨慎使用,并确保彻底记录。或者,根本不记录它,并假装它是选项四。


现在,对于提供的具体示例,即重载时出现超出范围错误operator[],我个人会选择选项四。并不是因为我特别喜欢看到其他程序员在处理我的代码时遭受痛苦(顺便说一句,我确实这样做,但这与讨论无关),而是因为这是预期的。

大多数情况下,程序员使用 时operator[],他们希望处理自己的边界检查,并且不依赖类型或类为他们做任何事情。即使在 STL 容器中,您也可以看到operator[](不进行范围检查)与其他冗余object.at()进行范围检查)并行的情况。使用您自己的重载运算符反映预期行为往往会产生更直观的代码。