抛出匿名异常子类

时间:2015-12-13 16:43:10

标签: c++

我正在玩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。

如何达到预期效果?

2 个答案:

答案 0 :(得分:2)

这不是一个答案本身,而是一些有助于您前进的重要信息:

首先,抛出匿名异常不太可能有用。例外情况由他们的类型捕获。如果你不能命名类型,你就不能明确地捕获异常 - 只能通过它的基础,在这种情况下你也可能只是抛出基础。

第二(这很重要):

很少有理由直接从std::exception派生。您应该从<stdexcept>

中定义的一种异常类型派生

这些是:

std::runtime_error - 表示某些运行时条件导致无法执行目前的服务(例如丢失的文件)。

std::logic_error - 表示尝试的内容永远不可能,并且程序在编译时无法检测到的方式基本上是错误的。

这里方便的参考:

http://en.cppreference.com/w/cpp/header/stdexcept

答案 1 :(得分: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,有人可以复制它,并且它命名同一个类。你必须创建一个匿名类的对象,然后没有人可以命名它。

话虽如此,我认为匿名的东西并不有用。最好在无名空间声明该类(所以你知道它是私有的),并且只需使用它。