小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/
目录
在写程序或者代码库的时候,标准给的这些异常一般是不够用的。这个时候你就可以继承异常类,然后自己设计异常类。
基础示例
#include <iostream>
#include <exception>
#include <string>
class myexception : public std::exception
{
public:
myexception(unsigned int code, const std::string &what_arg)
: m_code(code)
, m_what_arg(what_arg)
{
}
virtual const char * what(void) const noexcept override
{
auto text = "错误代码:" + std::to_string(m_code) + "\r\n错误信息:" + m_what_arg;
return text.c_str();
}
private:
unsigned int m_code;
std::string m_what_arg;
};
int main(void)
{
try
{
throw myexception(10086, "这是一个很严重的错误");
}
catch (const std::exception &e)
{
std::cout << e.what() << std::endl;
}
return 0;
}
输出结果:
错误代码:10086
错误信息:这是一个很严重的错误
基础讲解
自定义异常类型myexception
,继承自std::exception
。构造函数接收错误代码和错误信息,然后保存。然后重写基类成员函数what()
,它需要返回C语言风格的字符串,可以使用字符串类的成员函数c_str()
获取C语言风格的字符串。而关键字noexcept
是从基类继承的。
在主函数抛出myexception
的对象,就可以使用捕获语句捕获这个一场对象,然后输出错误信息。
巩固练习
std::vector
中的at()
对于越界的情况会抛出异常std::out_of_range
。不过为了进行练习,尝试自己实现一个my_out_of_range
异常,并且对simple_vector
的at()
进行修改。