【发布时间】:2020-06-25 09:47:36
【问题描述】:
对于我当前的项目,我会定期定义我想要捕获的自定义异常。
但是,关于这些异常的定义,我正在努力决定我的代码的最佳结构是什么。
最初,我只是定义了嵌套在抛出它们的类中的异常,如下所示:
class Foo {
struct CustomException : public std::runtime_error {
}
void TrySomething() {
throw CustomException();
}
};
但是,现在我正在使用模板类,如果不提供模板参数,我将无法访问此异常。也就是说,我做不到:
template class <T>
class Foo {
struct CustomException : public std::runtime_error {
}
void TrySomething() {
throw CustomException();
}
};
void SomeFunction() {
try {
Foo foo;
foo.TrySomething();
}
catch (const Foo::CustomException& exc) {
}
}
因为没有模板参数的 Foo 不是一个类。 我正在尝试找出最干净的解决方案是什么(可以选择重新设计项目的其余部分以遵循所选标准)。
想到的选项:
- 为 Foo 做一个接口,并把异常类放在那里(这似乎有点过分,只是为了这个原因做一个接口)
- 将异常放入我专门为 Foo 创建的命名空间中
- 将异常“免费”放在 Foo 周围(但我猜是在项目命名空间中,我现在的项目没有该命名空间,但无论如何我已经阅读了这是一种很好的做法)
- 将所有异常放在单个文件、命名空间或结构中
- 创建一个 'Exceptions' 命名空间,并在我想添加一个时扩展它(在引发异常的类文件中)
【问题讨论】:
-
为什么你倾向于将你的异常声明为嵌套类?
-
因为我不知道还能把它放在哪里:P 这就是我问这个问题的原因
-
只要让它们成为独立的类。
-
好的,但是我把这些独立的类放在哪里呢?在同一个文件中,不同的文件?所有异常的一个文件?在命名空间中? ..这是我的问题
-
我取决于您项目的编码标准。通常它声明“每个类一个文件”,但您可以将它们全部放在一个文件中。
标签: c++ exception namespaces file-structure