我正在玩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。
如何达到预期效果?
答案 0 :(得分:2)
这不是一个答案本身,而是一些有助于您前进的重要信息:
首先,抛出匿名异常不太可能有用。例外情况由他们的类型捕获。如果你不能命名类型,你就不能明确地捕获异常 - 只能通过它的基础,在这种情况下你也可能只是抛出基础。
第二(这很重要):
很少有理由直接从std::exception
派生。您应该从<stdexcept>
这些是:
std::runtime_error
- 表示某些运行时条件导致无法执行目前的服务(例如丢失的文件)。
std::logic_error
- 表示尝试的内容永远不可能,并且程序在编译时无法检测到的方式基本上是错误的。
这里方便的参考:
答案 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,有人可以复制它,并且它命名同一个类。你必须创建一个匿名类的对象,然后没有人可以命名它。
话虽如此,我认为匿名的东西并不有用。最好在无名空间声明该类(所以你知道它是私有的),并且只需使用它。