【问题标题】:Custom exceptions in c++: where do I define them?c++ 中的自定义异常:我在哪里定义它们?
【发布时间】: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


【解决方案1】:

如果您的异常确实与模板类密不可分,但独立于模板的特定实例化,则使用类似的模式

struct FooBase
{
   struct FooBaseException : public std::exception
   {
   };
};

template class <T> 
struct Foo : FooBase
{
};

是一种方式。将应用空基类优化,至少从概念上讲,您已经在模板实例之间引入了一些关系。

接下来,您可能会发现通用函数出现在基类中。

这种模式在 1990 年代很常见,模板可能会导致代码膨胀,但我也看到了它在这个特定实例中的用途。

【讨论】:

  • 谢谢!您是否认为将异常嵌套到“抛出”它们的类中并不常见?
【解决方案2】:

我真的不明白为什么你需要为你的例外做模板。 我相信该代码将满足您的所有需求。您可以为常用异常创建枚举,也可以生成单个自定义异常。

    enum class ErrorCode {
      kErrorOne,
    };
    
    // Helper function to get an explanatory string for error
    inline std::string GetErrorString(ErrorCode error_code) {
      switch (error_code) {
        case ErrorCode::kErrorOne:
          return "Some error";
      }
      return {};
    }

    class CustomException : public std::runtime_error {
     public:
      explicit CustomException(ErrorCode error_code) : std::runtime_error{GetErrorString(error_code)} {}

  CustomException(const std::string& what)
      : std::runtime_error{what} {}    
    };

另外,您可以在这里查看a pretty similar question

【讨论】:

  • 不,问题不在于有一个带有模板参数的错误类,而是在抛出错误的类中有一个嵌套的错误类。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 2021-12-29
  • 2021-12-18
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多