Search code examples
c++clang-tidy

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;
}

I just use some code like this, but the throw will remind some warnings which called

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

How can I solve this problem?


Solution

  • consider the following code:

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

    If you derive your illegalParameterValue class from std::exception, then the catch clause above will catch it (along with other kinds of exceptions derived from std::exception). As currently written, it will not. Your users will have to add another catch clause:

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

    Maybe that's what you want, maybe not. But there's a lot of code out there like the first case.