处理许多自定义异常的最佳方法是什么

时间:2018-05-13 10:23:35

标签: c++ exception design-patterns

由于一些要求,在我的cpp库中我需要添加许多自定义异常(差不多50+),所以我想写一个自定义异常,如下所示,

 #include <iostream>
 #include <exception>

 using namespace std;

 class ScaleException: public exception
 {
   virtual const char* what() const throw()
   {
     return "My ScaleException happened";
   }
 };



 class NotExistException: public exception
 {
   virtual const char* what() const throw()
   {
     return "NotExistException";
   }
 };

 class StateException: public exception
 {
   virtual const char* what() const throw()
   {
     return "StateException";
   }
 };


 int main ()
 {


   try
   {
     throw ScaleException();
   }
   catch (exception& e)
   {
     cout << e.what() << endl;
   }
   return 0;
 }

但我担心的是我需要编写这么多自定义异常类(我有几乎50多种不同的异常,所以我最终可能会编写那么多异常类),有没有办法在一个或几个中定义所有异常类这些类很容易并且意味着完全抛出异常。

我应该有什么样的设计?

1 个答案:

答案 0 :(得分:2)

您应该考虑两个选项:

  1. 拥有一个异常类,其构造函数采用异常特定的数据:

    let giaTri = value as! Int
    myGuessTotalCorrect = addSeparateMarkForNumber(int: giaTri)
    
  2. 使用模板参数区分异常类:

    namespace mylib {
    
    using exception_kind_t = unsigned;
    enum ExceptionKind : exception_kind_t {
        InvalidScale = 0,
        NonExistentResource = 1,
        Whatever = 2
    }; 
    
    class exception : public std::exception {
    public:
        static const char*[] messages = {
            "invalid scale", 
            "non-existent resource",
            "whatever"
        };
        exception(exception_kind_t kind) : kind_(kind) { }
        exception(const exception&) = default;
        exception(exception&&) = default;
        exception_kind_t kind() const { return kind_; }
        virtual const char* what() const throw() {
            return messages[kind_];
        }
    protected:
        exception_kind_t kind_;
    };
    } // namespace mylib
    
  3. PS - 我已经测试过这段代码,只是在这里潦草地写下来,所以要专注于这个想法而不是具体细节。