**已关闭。**此问题需要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;
}
};
1条答案
按热度按时间bkhjykvo1#
在我看来,catch子句与throw子句中的异常的数据类型不匹配。有两件事可以帮助你解决这个问题:
1.将异常声明和使用为顶级类,而不是类中的类。
1.声明它以继承标准异常
class InvalidShift : public std::exception {
。然后,在你的catch子句中你可以提到std::exception,然后也许用一个调试器来看看你抛出的实际异常的类型。