我在玩c++异常,并且尝试过抛出这样的匿名异常:
throw class : public std::exception
{
virtual const char *what() const noexcept
{
return "Custom exception";
}
} ex;
但是,尝试编译时出现以下错误:
error: expected primary-expression before ‘class’
throw class : public std::exception
^
我的编译器是Linux x86_64上的gcc 5.2.1。
如何获得理想的结果?
最佳答案
您不能在throw语句中声明一个类。首先声明该类(如果愿意,可以通过typedef对其进行匿名命名),然后可以将其抛出。
更好的是命名异常类,但是将其放在无名的命名空间中:
namespace {
class LocalException : public std::exception {
const char *what() const noexcept override {
return "Custom exception";
}
};
}
....
throw LocalException();
或者,如果您坚持要创建一个匿名类的对象,然后将其抛出。
static class : public std::exception {
const char *what() const noexcept override {
return "Custom exception";
}
} LocalExceptionObject;
....
throw LocalExceptionObject;
编辑如果创建typedef,则有人可以复制它,并且它命名相同的类。您必须创建一个匿名类的对象,然后没人可以对其进行命名。
话虽如此,我认为拥有匿名的东西是没有用的。最好在无名的命名空间中声明该类(这样就知道它是私有(private)的),然后使用它。
关于c++ - 抛出匿名异常子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34253544/