【问题标题】:What is the best way to throw exceptions in classes?在类中抛出异常的最佳方法是什么?
【发布时间】:2018-08-11 08:33:36
【问题描述】:

在类中抛出异常时,程序员的工作是确保该异常在类中被捕获吗?还是假设此异常将在主文件/运行程序中捕获是最佳实践?我相信是后者,但我有点不确定....采取以下代码:

#include <stdexcept>
#include <iostream>

using namespace std; // supposedly trustworthy duck

class Duck
{
public:
      Duck(int quack_nominee);
private:
      int quack_strength;
};

Duck::Duck(int quack_nominee)
{
     if (quack_nominee < 0)
     {
             throw runtime_error("A quack having a negative value produces undefined behavior on reality.");
     }

     quack_strength = quack_nominee;
}

上面的代码是好的做法吗?我假设抛出的 runtime_error 会在某处被捕获。如果使用我的类的程序员没有实现 try-catch 块,.exe 文件将崩溃(至少在我的 IDE 和编译器上)。

另外,如果我应该在类本身中有一个 try-catch 块,是否可以合法地实现它?

【问题讨论】:

  • 您的“错误”称为异常。
  • 如果可以处理异常,就应该捕获它。如果无法处理异常,则不应捕获它(除非它被捕获、记录并重新抛出)。考虑一个例外,相当于“弃船!”。
  • 哦,差点忘了:什么异常不应该用于非异常情况的流控制。
  • 此外,对于此特定代码,使用 unsigned 参数或只是将其未定义(通常不推荐,仅出于效率目的)是替代方法,具体取决于您的意图。
  • 在这种情况下std::invalid_argument 可能是一个更合适的例外:“报告由于参数值未被接受而出现的错误”。与std::runtime_error相反:“报告由于超出程序范围的事件而导致的错误,并且无法轻易预测”.

标签: c++ class c++11 error-handling try-catch


【解决方案1】:

异常的全部意义在于终止函数的执行流程,并将无法在函数内处理的错误情况通知调用者。所以不,您绝对不必捕获自己的异常,因为它违背了异常的目的。

另一个问题是您应该使用异常报告什么样的错误。这主要取决于特定的用例,但最常见的情况是无效的输入参数或外部错误(例如,来自 OS 或 DB 或程序外部的任何内容),在不违反“最小意外原则”的情况下无法在函数内处理。

【讨论】:

    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多