在用 C++ 编写科学软件多年后,我似乎仍然无法习惯异常,也不知道什么时候应该使用它们。我知道使用它们来控制程序流是一个很大的禁忌,但除此之外......考虑以下示例(摘自表示图像蒙版并让用户将区域添加为多边形的类):
class ImageMask
{
public:
ImageMask() {}
ImageMask(const Size2DI &imgSize);
void addPolygon(const PolygonI &polygon);
protected:
Size2DI imgSize_;
std::vector<PolygonI> polygons_;
};
此类的默认构造函数创建一个无用的实例,具有未定义的图像大小。我不希望用户能够将多边形添加到这样的对象。但我不确定如何处理这种情况。当大小未定义并调用 addPolygon() 时,我应该:
- 默默归来,
- assert(imgSize_.valid) 使用此类检测代码中的违规行为并在发布前修复它们,
- 抛出异常?
大多数情况下,我选择 1) 或 2)(取决于我的心情),因为在我看来,对于这样一个简单的场景来说,例外是昂贵的、混乱的并且简直是矫枉过正。请问有什么见解吗?