正在引发匿名异常子类

Throwing anonymous exception subclass

本文关键字:异常 子类      更新时间:2023-10-16

我玩的是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。

我怎样才能达到预期的效果?

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

首先,抛出匿名异常不太可能有用。异常按其类型捕获。如果不能命名类型,就不能显式地捕获异常——只能通过它的基来捕获,在这种情况下,您可能只是抛出了基。

第二(这很重要):

很少有充分的理由直接从std::exception中推导出来。您应该从<stdexcept> 中定义的异常类型之一派生

这些是:

std::runtime_error-表示某些运行时条件使得在时刻无法执行服务(例如缺少文件)。

std::logic_error-表示所尝试的永远不可能实现,并且程序在编译时无法检测到的根本错误。

这里的方便参考:

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

不能在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,有人可以复制它,它会命名同一个类。您必须创建一个匿名类的对象,然后没有人可以命名它

话虽如此,我不认为拥有匿名的东西是有用的。最好在一个没有名字的命名空间中声明类(这样你就知道它是私有的),然后直接使用它