c++ - 为什么抛出一个非异常被认为是糟糕的设计?

标签 c++ exception

我有一些代码可以对对象 vector 进行排序。如果任何对象无效,我想立即停止排序并报告错误。在错误中,我想包括一个无效对象的描述(如果有很多,不管哪个)。

这是我的代码(不完整,但希望你能关注我):

int sortProc(const Bulk & b1, const Bulk & b2) {
    if (!b1.isValid()) throw b1;
    if (!b2.isValid()) throw b2;
    return b1.compareTo(b2);
}

vector<Bulk> * items = getItems();
try {
    sort(items->begin(), items->end(), sortProc);
} catch (const Bulk & item) {
    cout << "Cannot sort item: " << item.description();
}

现在,我有点不确定我的代码,因为我听说所有异常都应该子类化异常类并且抛出不是异常实例的对象被认为是不好的做法,但我真的不明白为什么.我上面的代码有效,有什么问题吗?这是一个严肃的问题,所以如果您看到任何问题,我很乐意知道。我不是在寻找道德问题。

最佳答案

I'm not looking for moral concerns.

你不能问一个风格问题然后禁止所有基于“道德问题”的答案,如果你想弄明白的话。

有些人认为只抛出派生类型为 std::exception 的对象提供接口(interface)的一致性,因为您可以调用 .what()在所有这些上并在程序的顶层将它们全部捕获。您还可以保证 其他 翻译单位 — 那些从未听说过您的类(class)的人 Bulk — 如果他们愿意,将能够捕获异常(如果仅作为 std::exception )。

  • 你的程序错了吗?没有。

  • 它有效吗?是的,当然有。

但有时仅仅“工作”还不够,我们希望事情更整洁一些。

原来是这样啊

关于c++ - 为什么抛出一个非异常被认为是糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20479586/

相关文章:

c++ - 如果在从头到尾迭代时在 map 元素上调用 erase() 会发生什么?

C++ 域特定的嵌入式语言运算符

python - 检查 PyObjects C 类型

java - 为什么我收到一条错误消息说没有抛出任何异常?

exception - 阅读时的 mv()

c++ - 当作为 Lambda 实现时,auto 的扣除不起作用。错误 : before deduction of 'auto'

c++ - 如何制作一个动态大小的数组?动态数组的一般用法(也可能是指针)?

c++ - 在设计时未考虑异常安全的方法/类中提供强有力的保证

c# - 抛出类型为 'System.Data.StrongTypingException' C# 的异常

php,异常可以向上抛出2级吗?