c++ 如何在构造函数中处理异常[已关闭]

4c8rllxm  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(134)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我在捕获一个从构造函数抛出的异常时遇到了问题。我已经从另一个类的构造函数中捕获了异常,但由于某种原因,这个类导致我的程序在我试图以同样的方式捕获异常时提前终止。
我尝试做的很简单。如果ProductionWorker对象的班次号不是1或2,则抛出异常InvalidShift。当我这样做时,它似乎可以很好地处理通过setter函数导致班次号无效而导致的异常,如下所示:

void setShift(int s) // Works as expected
    {
        // If the shift is not 1 or 2, then throw an exception
        if (s != 1) {
        throw InvalidShift(s);
        } else {
            shift = s;
        }
    }

然而,当我尝试在类的构造函数中做同样的事情时,它只是提前终止。

// Constructor
// Terminates early due to an unhandled exception
ProductionWorker(string aName, string aNumber, string aDate,
                 int aShift, double aPayRate) :
                 Employee(aName, aNumber, aDate)
{
    if (shift != 1) {
        throw InvalidShift(aShift); // Visual Studio complains of an unhandled exception here
    } else {
         shift = aShift; payRate = aPayRate;
    }
}

我是这么称呼它的:

try {
    cout << "Creating ProductionWorker with a bad shift" << endl;
    ProductionWorker invalid("James Quinn", "4254", "05/27/2003", 20, 19.00);
    displayProductionInfo(invalid);

} catch (ProductionWorker::InvalidShift e) { // Code never reaches this point
    cout << "Error: " << e.getShift() << " is not a valid shift number. "
        << "Enter a shift number of either 1 or 2."
        << endl << endl;
}

下面是InvalidShift类的代码:

class ProductionWorker : public Employee {
public:
    // Exception class
    class InvalidShift {
    private: 
        int shift;
    public: InvalidShift(int shift) {
        this->shift = shift; 
    }
          int getShift() const {
              return shift;
        }
    };
bkhjykvo

bkhjykvo1#

在我看来,catch子句与throw子句中的异常的数据类型不匹配。有两件事可以帮助你解决这个问题:
1.将异常声明和使用为顶级类,而不是类中的类。
1.声明它以继承标准异常class InvalidShift : public std::exception {
然后,在你的catch子句中你可以提到std::exception,然后也许用一个调试器来看看你抛出的实际异常的类型。

相关问题