正在引发匿名异常子类
Throwing anonymous exception subclass
我玩的是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语句中声明类。首先声明类
更好的方法是命名异常类,但将其放在无名称空间中:
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,有人可以复制它,它会命名同一个类。您必须创建一个匿名类的对象,然后没有人可以命名它
话虽如此,我不认为拥有匿名的东西是有用的。最好在一个没有名字的命名空间中声明类(这样你就知道它是私有的),然后直接使用它
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 捕获全部处理程序检测C++中的子类异常
- 如何从私有成员子类对象捕获异常
- 正在引发匿名异常子类