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

时间:2013-11-23 03:12:32

标签: c++ exception constructor

我创建了自己的MatrixArithmeticException,其构造函数使用int指定了哪种类型的错误。我已经在我的代码中尝试了两种方法来抛出异常。这有两种方式:

  1. 创建MatrixArithmeticException的实例并抛出实例。
  2. throw MatrixArithmeticException(0); //or whatever the int is supposed to be
  3. 代码以任何一种方式工作,但我的问题是,哪种方式更有效(就空间而言)?另外,为什么第二种方式似乎也能正常工作?

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

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

    MatrixArithmeticException dimensionsDoNotMatch(0);
    throw dimensionsDoNotMatch;
    

    我想这个问题就是基于堆栈的C ++等同于问别人之间的区别:

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

    和此:

    throw new MatrixArithmeticException(0);
    

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

3 个答案:

答案 0 :(得分:2)

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

第二种方法是创建一个临时对象(一个右值)并抛出它 - 但是,抛出通常涉及复制 - 如果它不被删除或移动。

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

另外,一个小的“注释” - 使用int来表示已经犯了什么错误是你可能希望避免做的事情,即使我看不出你正在做什么;试试enum!

答案 1 :(得分:0)

  1. 不要在堆上构造异常(使用new())。
  2. 不要复制捕获的异常实例,重新抛出。
  3. 使用const引用抓住它们。
  4. 这些是我处理C ++异常的经验法则。

      

    为什么第二种方式似乎也能正常工作?

    您的MatrixArithmeticException只是提供了一个int argument的构造函数。它们的分配没有区别(来自构造函数声明),并且两个方法都会在堆栈上创建异常(除了你在考虑'创建实例'时使用new MatrixArithmeticException () ,见我的观点1.然后)。

答案 2 :(得分:0)

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

决定抛出一个错误,你可以直接抛出一个错误对象,或者抛出一个指向它的指针,大多数代码已经看到直接抛出错误对象。

决定直接抛出它可以在throw语句中或提前构建它。如果是一个简单的错误,我建议将它构建到位,如上面的情况所示

您的线条基本上是等效的,除了在第一个中,临时错误值在被抛出之前在逻辑上被转储到局部变量中,而在后者中它存在于未命名的临时变量中。它的不同之处在于它们的速度会有所不同,但如果它们不同,后者可能会更快。