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/

相关文章:

android - 系统.DllNotFoundException : sqlcipher release build Xamarin

来源不明的 java.util.NoSuchElementException

python - 在 Python Paramiko 中捕获 AuthenticationException

c++ - 将字符串列表插入二维 vector

c++ - 多层继承在 C++ 中有意义吗?

c++ - 在函数调用的参数中使用赋值运算符

exception - Gradle 构建/测试失败 - kryo.KryoException : Buffer overflow

c++ - std::mutex 最佳实践

c++ - 如何在 C++ 中从 void* 数组中有效地解压 float、int16、int32 等数据?

c++ - 在没有 Xcode 的情况下在 Mac OS X 上构建 VST 插件