C++ 例外类

C++ 例外类,c++,exception,C++,Exception,所以我正在为链表做一个类异常,但我不知道该把它放在什么地方。例如,如果用户想要删除列表中不存在的元素,它将打印“捕获稀疏异常:未找到元素,删除失败”或“捕获稀疏异常:稀疏矩阵为空,打印失败”。我这样做可以吗?如果是,我如何打印信息 SparseException::SparseException () { } SparseException::SparseException (char *message) { if (strcmp(message, "delete")) cout &

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

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
{

}
SparseException::SparseException()
{
}
SparSeeException::SparSeeException(字符*消息)
{
if(strcmp(信息“删除”))

cout在我看来,异常应始终继承
std::exception
或其子类之一。这将让您了解应该实现的接口。例如,您需要
what
方法(实际上
what
返回您的
printMessage
可能打印的内容)。此外,如果您真的想打印异常的what消息,最好重载
操作符在我看来,异常应始终继承
std::exception
或其子类之一。这将让您了解应该实现的接口。例如,您需要
什么
方法(事实上,
what
返回您的
printMessage
可能会打印的内容)。此外,如果您真的想打印异常的what消息,最好重载
操作符添加到@Ivaylo post,行

if (strcmp(message, "delete"))
应该读

if (0 == strcmp(message, "delete"))

在@Ivaylo post中添加

if (strcmp(message, "delete"))
应该读

if (0 == strcmp(message, "delete"))

如果要创建自定义的
异常
,最好从
std::Exception
或其子类型(如
runtime\u error
logic\u error
)继承它。此外,在异常类中打印消息是没有意义的,这是客户机的责任。您只需要重写
what
方法,这是转换详细的异常消息(也就是说,
runtime\u error
logic\u error
的默认实现通常是正常的)


语句
if(strcmp(message,“delete”){…}
也没有什么意义(实际上应该是
!strcmp(…)
)。如果您只想打印不同的消息,将该消息传递给异常的构造函数就足够了。但是,如果您需要区分异常,最好添加一些类,例如从公共基继承的
sparseeException
SparseEmptyException
(这反过来又继承自
std::exception
).

如果要创建自定义的
异常
,最好从
std::Exception
或其子类型(如
runtime\u error
logic\u error
)继承它。此外,在异常类中打印消息是没有意义的,这是客户机的责任。您只需要重写
what
方法,而ich返回详细的异常消息(也就是说,
runtime\u error
logic\u error
的默认实现通常是正常的)


语句
if(strcmp(message,“delete”){…}
也没有什么意义(实际上应该是
!strcmp(…)
)。如果您只想打印不同的消息,将该消息传递给异常的构造函数就足够了。但是,如果您需要区分异常,最好添加一些类,例如从公共基继承的
sparseeException
SparseEmptyException
(这反过来又继承自
std::exception
)。

通常,异常类只包含出错的信息。通常,它们包含一个字符串,因为字符串可以包含“将123写入文件c:/a.txt失败”所需的所有内容

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


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

通常,异常类只包含出错的信息。通常,它们包含一个字符串,因为字符串可以包含您想要的任何内容“将123写入文件c:/a.txt失败”

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

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

所以我正在为链表做一个类异常,但我不知道该把它放在什么地方

首先,考虑继承STD::异常层次结构(通常我继承自STD::RunTimeTyError或STD::Logic错误)。它将为您提供一个基本类,它接收一个描述错误的字符串消息,并允许您的客户端代码通过捕获一个通用的STD::异常REF.

来接收和处理异常。 例如,如果用户想要删除列表中不存在的元素,它将打印“捕获稀疏异常:未找到元素,删除失败”或“捕获稀疏异常:稀疏矩阵为空,打印失败”。我可以这样做吗

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

就你而言:

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");
如果是,我如何打印信息

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
{

}
客户端代码:

try
{
    // ...
} catch(const SparseException& e)
{
    std::cerr << "SparseException: " << e.what() << "\n"; // what() is a member
                                                          // of std::exception
}
试试看
{
// ...
}捕获(常数SPARSEEException&e)
{