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)
{