在C++中抛出异常的两种方法(不使用堆)

Two ways to throw exception in C++ (without using the heap)

本文关键字:方法 C++ 抛出异常 两种      更新时间:2023-10-16

我制作了自己的MatrixArithmeticException,它的构造函数采用int来指定犯了哪种类型的错误。我在代码中尝试了两种抛出异常的方法。这是两种方式:

  1. 创建一个MatrixArithmeticException的实例并抛出该实例
  2. throw MatrixArithmeticException(0); //or whatever the int is supposed to be

无论哪种方式,代码都有效,但我的问题是,哪种方式(就空间而言)更有效?另外,为什么第二种方式看起来同样有效?

编辑:从我收到的关于这个问题的几个答案(以及对其中一个答案的评论)来看,我应该首先提供我的代码。

我从来没有以任何一种方式使用过动态记忆(我试图在问题的标题中暗示这一点,但这显然是不够的)。至于我的第一种方法的代码,我这样做了:

MatrixArithmeticException dimensionsDoNotMatch(0);
throw dimensionsDoNotMatch;

我想这个问题将是基于堆栈的C++,相当于问某人这两者之间的区别:

MatrixAritmeticException dimensionsDoNotMatch = new MatrixArithmeticException(0);
throw dimensionsDoNotMatch;

这个:

throw new MatrixArithmeticException(0);

这两个问题似乎有一个共同的答案。std::cout << "Thanks, guys!!" << std::endl;

第一种方法是显式地创建一个本地对象作为左值(可以获取其地址),然后抛出它。

第二种方法是创建一个临时对象(一个右值)并抛出它——然而,抛出通常涉及复制——如果它没有被删除或移动的话。

第二种可能更有效,因为它可以在没有你干预或提示的情况下消除和/或移动。

此外,一个小的"注意"——用int来象征犯了什么错误,这是你可能希望避免做的事情,即使我看不出你到底在做什么;请尝试枚举!

  1. 不要在堆上构造异常(使用new()
  2. 不要复制捕获的异常实例,请重新抛出
  3. 使用const引用捕获它们

这些是我处理C++异常的经验法则。

为什么第二种方式看起来同样有效?

您的MatrixArithmeticException只是提供了一个采用int argument的构造函数。它们的分配(来自构造函数声明)没有区别,并且这两个方法都会在堆栈上创建异常(此外,在说"创建实例"时,您已经考虑过使用new MatrixArithmeticException (),请参阅我的观点1。然后)。

您可以在C++中抛出几乎任何东西,尽管我们通常会抛出错误。

在决定抛出错误后,您可以直接抛出错误对象,或者抛出指向它的指针,尽管大多数代码都看到过直接抛出该错误对象。

决定直接抛出后,您可以在抛出语句中构造它,也可以提前构造它。如果这是一个简单的错误,我建议将其构建到位,就像上面的情况一样

行基本上是等价的,只是在第一行中,临时错误值在抛出之前在逻辑上转储在本地变量中,而在后面的行中,它驻留在一个未命名的临时变量中。与之不同的是,它们的速度会有所不同,但如果它们这样做了,那么后者可能会更快。