我在玩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/

10-15 01:30