【问题标题】:Strange format for throwing exception from a constructor从构造函数抛出异常的奇怪格式
【发布时间】:2012-11-11 17:56:05
【问题描述】:

我们的教授给了我们一个shell来编写程序。他给了我们一个名为“Maker”的类,它能够抛出异常。考虑到他提供的构造函数的格式,我对如何抛出和捕获错误感到困惑。

他给了我们他自己的特殊异常头文件 CycleFoundException.h,看起来像这样:

#include <iostream>
#include <exception>

using namespace std;

class CycleFoundException: public exception {
  // Don't add code
};

这里是 Maker.h 头文件:

#include "CycleFoundException.h"    

class Maker
{
 private:
  // insert instance variables

 public:
  Maker(int x) throw (CycleFoundException);
};

最后是 cpp shell,Maker.cpp:

#include Maker.h

Maker::Maker(int x) throw (CycleFoundException){
//add code here
}

int main()
{
    return 0;
}

我从未见过这样的构造函数声明。为什么将“抛出(CycleFoundException)”标记到构造函数的声明中?有必要吗?

如果采用这种格式,我将如何抛出异常?我是否仍会以与其他方式相同的方式执行此操作,即如果不满足某个条件则抛出异常(从构造函数的主体内)?谢谢。

【问题讨论】:

  • 尝试阅读有关 throws 关键字的更多信息。
  • “shell”可能不是在这里使用的理想词
  • using namespace std;标头中?这会带来很多麻烦。叹息。
  • 我很难相信你的教授给了你这个代码来使用它而不教你它是什么,虽然......

标签: c++ exception constructor


【解决方案1】:

这只是说明一个函数允许抛出哪些类型的异常的一种方式:

Maker::Maker(int x) throw (CycleFoundException)

表示Maker::Maker(int)只允许抛出CycleFoundException异常,没有别的。这称为“异常规范”。

请注意,C++ 标准已弃用此机制。它不应该再使用了。你应该把这件事告诉你的教授;-) 他们总是有问题:http://mu2e.fnal.gov/public/hep/computing/standards/C++FAQ.shtml#exceptionspec

【讨论】:

  • +1 特别是用于识别教授正在教授不应该教授的东西
  • @LightnessRacesinOrbit 不过,了解它仍然是件好事,以防需要处理遗留代码。
猜你喜欢
  • 2011-11-04
  • 2019-03-11
  • 2023-03-11
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多