0

所以我正在为链表做一个异常类,但我不知道该放什么。例如,如果用户想要删除列表中不存在的元素,它将打印出“捕获稀疏异常” :未找到元素,删除失败”或“捕获到稀疏异常:稀疏矩阵为空,打印失败”。我可以这样做吗?如果是这样,我如何打印出消息?

SparseException::SparseException ()
{
}
SparseException::SparseException (char *message)
{
if (strcmp(message, "delete"))
      cout << "Sparse Exception caught: Element not found, delete fail";
   else
      cout << "Sparse Exception caught: sparse matrix empty, printing failed";
}

void SparseException::printMessage () const
{

}
4

5 回答 5

4

在我看来,异常应该始终继承std::exception或其子类之一。这将使您对应该实现的接口有所了解。例如,您需要一个what方法(实际上what返回您可能printMessage会打印的内容)。此外,如果您真的想打印您的异常是什么消息,最好重载operator<<.

需要继承std::exception,以便您知道 acatch(std::exception& ex)将捕获代码抛出的任何异常。

于 2013-02-14T10:03:34.910 回答
0

所以我正在为链表做一个例外类,但我不知道该放什么。

首先,考虑从 std::exception 层次结构继承(通常我从 std::runtime_error 或 std::logic_error 继承)。它将为您提供一个接收描述错误的字符串消息的基本类,并允许您的客户端代码通过捕获通用 std::exception ref 来接收和处理您的异常。

例如,如果用户想删除一个列表中不存在的元素,它会打印出“Sparse Exception catch: Element not found, delete fail”,或者“Sparse Exception crawl: sparse matrix empty, printing failed”。我可以这样做吗?

通常,您应该使用描述错误的完整消息(可以记录的字符串),而不是描述异常的类型(将其留给您的异常类层次结构)。

在你的情况下:

class SparseException: public std::runtime_error
{
public:
    SparseException(const std::string& message): std::runtime_error(message) {}
};

您的队列:

// ... 
if (whatever1)
    throw SparseException("element not found, delete failed");

// ...
if (whatever2)
    throw SparseException("sparse matrix empty, printing failed");

如果是这样,我如何打印出消息?

客户端代码:

try
{
    // ...
} catch(const SparseException& e)
{
    std::cerr << "SparseException: " << e.what() << "\n"; // what() is a member
                                                          // of std::exception
}
于 2013-02-14T10:41:39.600 回答
0

添加到@Ivaylo 帖子,该行

if (strcmp(message, "delete"))

应该读

if (0 == strcmp(message, "delete"))
于 2013-02-14T10:05:38.237 回答
0

如果你想创建一个自定义Exception,你最好继承它std::exception或其子类型,如runtime_erroror logic_error。此外,在异常类中打印消息是没有意义的,这是客户的责任。您只需要 overridewhat方法,该方法返回详细的异常消息(也就是说,runtime_errororlogic_error的默认实现通常是可以的)。

声明if (strcmp(message, "delete")) {...}也没什么意义(实际上应该是!strcmp(...))。如果您只想打印不同的消息,将该消息传递给异常的构造函数就足够了。但是,如果您需要区分异常,则最好添加一些类,例如SparseDeletionExceptionSparseEmptyException继承自公共基础SparseException(而后者又继承自std::exception)。

于 2013-02-14T10:06:08.347 回答
0

通常,异常类只包含有关问题所在的信息。通常,它们包含一个字符串,因为字符串可以包含几乎所有您想要“将 123 写入文件 c:/a.txt 失败”的内容。

在您提出的简单案例中,您应该使用不同类别的异常(如 SparseDeleteException)。或者,如果您想要更复杂的逻辑来获取错误文本,我建议使用不同的类来处理“错误 id”->“错误字符串”转换,因为这不是异常的任务。

此外,异常应该有一个方法toString而不是 print - 捕获方法应该能够决定如何处理消息。

于 2013-02-14T10:07:15.860 回答