c++ - 这种异常处理方式是好的做法吗?

标签 c++ exception

您会更改此代码中的任何内容吗?

class LocalPort {
public:
    LocalPort(int portNumber) {
      innerPort = new ACMEPort(portNumber);
   }

    void Open() {
      try {
          innerPort->Open();
      } 
      catch (DeviceResponseException& e) {
          throw PortDeviceFailure(e);
      } 
      catch (ATM1212UnlockedException& e) {
         throw PortDeviceFailure(e);
      } 
      catch (GMXError& e) {
         throw PortDeviceFailure(e);
      }
   } 
private: 
    ACMEPort* innerPort;
};

/////////

try {
    LocalPort* port = new LocalPort(12);
    port->Open();
} 
catch (bad_alloc& e) {
    ReportError(e);
    logger.Log("Wyjątek alokacji pamięci", e);
    delete port;
}
catch (PortDeviceFailure& e) {
    ReportError(e);
    logger.Log(e.getMessage(), e);
    delete port;
} 

我试图在上面做的是让代码在下面看起来和表现得更好。

try {
    ACMEPort* port = new ACMEPort(12);
    port->Open();
} 
catch (bad_alloc& e) {
    ReportPortError(e);
    logger.Log("Wyjątek alokacji pamięci", e);
    delete port;
}
catch (DeviceReponseException& e) {
    ReportPortError(e);
    logger.Log("Wyjątek odpowiedzi urządzenia", e);
    delete port;
} 
catch (ATM1212UnlockedException& e) {
    ReportPortError(e);
    logger.Log("Wyjątek odblokowania", e);
    delete port;
} 
catch (GMXError& e) {
    ReportPortError(e);
    logger.Log("Wyjątek odpowiedzi urządzenia");
    delete port;
}
catch (...) {
    ReportPortError(0);
    logger.Log("Wyjątek nieznanego pochodzenia");
    delete port;
}

我成功了吗?第一个比第二个好吗?你怎么看?

最佳答案

您的异常类似乎设计得很糟糕。你为什么不简单地添加一个成员函数 getMessage 到你的异常层次结构(最好在基类中,你所有的异常都派生自 - std::exception 提供了返回错误消息的方法 what)。这样,您可以简单地在一个语句中捕获所有异常,并以相同的方式处理它们。

class DeviceResponseException : public std::runtime_error {
public:
    DeviceResponseException() : std::runtime_error("Some error message") {}
};

class ATM1212UnlockedException : public std::runtime_error {
public:
    ATM1212UnlockedException() : std::runtime_error("Some other error message") {}
};

然后在您的代码中,您可以这样做:

try {
    std::auto_ptr<ACMEPort> port(new ACMEPort(12));
    port->Open();
}
catch( std::runtime_error & e) {
    ReportPortError(e);
    logger.Log(e.what(), e);
}

由于您的异常类都派生自 std::runtime_error,因此此 catch 子句会捕获所有异常类。这没关系,因为所有情况下的处理都是相同的。如果您有需要特殊处理的特定异常,您可以添加额外的 catch 子句。

此外,您应该使用 std::auto_ptrboost::scoped_ptr 或那种东西。了解 RAII .

关于c++ - 这种异常处理方式是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897500/

相关文章:

c++ - 从包含不同对象的 vector 中,如何调用正确的函数?

c++ - constexpr 上下文中 constexpr 函数内的所有函数是否都必须是 constexpr 函数?

python - 如何创建抽象类属性(可能是只读的)

javascript - IE8开发者工具调试器给出错误的异常信息

Python:变量 "tricking"try-exception,但适用于 if 语句

python - selenium.common.exceptions.InvalidSelectorException 与 "span:contains(' 字符串')”

c++ - 在 C++ 中获取 const char * 长度的最佳方法

c++ - 是否可以获取矩阵行的引用?

c++ - 安卓工作室 : Trying to compile a c++ multiple libraries code with interdependencies

.net - 在进程关闭期间处理 ObjectDisposedException 和类似异常?