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/

相关文章:

java - 在不重新编译实现类的情况下更改接口(interface)

c# - 什么时候 try catch 不是 try catch?

c++ - 指针 vector 的复制构造函数

c++ - 如何通过自定义的 streambuf 设置流的 badbit

c++ - 获取 constexpr 全局变量(不是静态成员)的链接器符号

c++ - 常量数组和常量指针的重载函数

java - 为什么在方法重写的情况下引用类型?

c++ - 如何在 cmake >= 2.6 中使用没有 gnu 扩展的 c++98?

c# - 如何使用 AsyncPump 在异步控制台应用程序中保留异常上下文?

android - 在启用测试模式后,Gradle构建失败?