为什么“throw”会显示警告?

Why " throw" will display a warning?

#include <iostream>
#include <sstream>

using std::string;
using std::cout;
using std::endl;
using std::ostringstream;

class illegalParameterValue {

private:
    string message;
public:
    illegalParameterValue() : message("Illegal parameter value") {}
    explicit illegalParameterValue(const char* theMessage) {message = theMessage;}
    void outputMessage() {cout << message << endl;}

};

int main() {

    ostringstream s;
    s << "index = " << 1 << " size = " << 2;
    throw illegalParameterValue(s.str().c_str());

    return 0;
}

我只是用了一些这样的代码,但是throw会提醒一些调用

的警告

Clang-Tidy: Throwing an exception whose type 'illegalParameterValue' is not derived from 'std::exception'

我该如何解决这个问题?

考虑以下代码:

try {
  // do something that might throw an exception
}
catch (const std::exception &ex) {
  // handle the exception
}

如果您从 std::exception 派生 illegalParameterValue class,则上面的 catch 子句将捕获它(以及从 std::exception 派生的其他类型的异常)。正如目前所写,它不会。您的用户将不得不添加另一个 catch 子句:

try {
  // do something that might throw an exception
}
catch (const std::exception &ex) {
  // handle std exceptions
}
catch (const illegalParameterValue &ip) {
  // handle illegal parameter exeception
}

也许这就是您想要的,也许不是。 但是像第一种情况一样有很多代码。