【问题标题】:C++ Indicate Class Function Throws Custom ExceptionC++ 指示类函数引发自定义异常
【发布时间】:2016-12-02 15:19:04
【问题描述】:

我已经尝试了大约 20 次尝试并在过去 2 小时内阅读了大量页面,但无法弄清楚我在这里做错了什么:

#pragma once
#include <exception>
using namespace std;

class EmptyHeap : public exception {
public:
    virtual const char* what() const throw()
    {
        return "The heap is empty!";
    }
};

然后在堆类中,一个公共方法:

void remove() throw()//EmptyHeap
{
    if (isEmpty())
    {
        EmptyHeap broken;
        throw broken;
    }
    ...

此代码有效,但原始标题是:

void remove() throw EmptyHeap;

有没有办法指定方法在 C++ 中抛出什么异常,或者这只是 Java 的事情?

【问题讨论】:

  • The correct syntaxthrow(EmptyHeap)(注意括号)。进一步注意,不推荐使用异常规范。放下它。
  • 请注意,这很可能根本不是例外。您将如何从EmptyHeap 异常中“恢复”?从空堆中删除某些东西是一个编程错误,因此正确的做法是为isEmpty 添加一个前提条件。这意味着您要记录类用户的前提条件并在代码中添加assert(!isEmpty());
  • 另请注意,所有编译器 (*coughVisualStudiocough*) 都不太支持 C++ 异常规范,即使在它被弃用之前也是如此。

标签: c++ throw custom-exceptions


【解决方案1】:

有没有办法指定方法在 C++ 中抛出什么异常,或者这只是 Java 的事情?

是的,是的,这是一个在任何 c++ 程序中都非常不受欢迎的 java 东西。如果函数可以抛出异常,只需将异常规范留空即可。如果不能,请使用noexcept (>= c++11) 或throw() (

此外,您可以通过从std::runtime_errorstd::logic_error(或任何其他标准错误)派生任何用户异常来帮助自己。

例如

#include <stdexcept>

// this is literally all you need.
struct EmptyHeap : std::logic_error {
    // inherit constructor with custom message
    using logic_error::logic_error; 

    // provide default constructor
    EmptyHeap() : logic_error("The heap is empty") {}
};

现在抛出:

throw EmptyHeap();

或使用自定义消息:

throw EmptyHeap("the heap is really empty");

【讨论】:

  • “Java 事物”被称为“检查异常”,实际上在好的 Java 代码中也很少见。请参阅 Joshua Bloch 的 Effective Java 书籍中的第 41 条(“避免不必要地使用检查的异常”)。
  • 这几乎证实了我的怀疑,即老师来自 Java 背景,与我一起工作的学生不断来找我这些 C++ 作业,感觉不像 C++ 作业。跨度>
  • @JosephSchmidt 这对学生来说是一个可怕的耻辱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多