为什么“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
}
也许这就是您想要的,也许不是。
但是像第一种情况一样有很多代码。
#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
}
也许这就是您想要的,也许不是。 但是像第一种情况一样有很多代码。