例如:括号不匹配,多或少分号,等等。 对于此类错误,慢慢调试吧。
对于此类错误,直接有约定的处理方式。 例如:程序需要从配置文件读入配置信息,如果配置文件不存在,直接使用默认配置,等等。
具体可分为:
- 调用者的错误,例如:指针参数为空,索引超出范围,矩阵不匹配,等等
- 内存错误,例如:
new
返回nullptr
,等等 - 其它函数错误等等
对于此类错误:
- 如果是自己使用 或者 自己团队使用,直接退出即可
- 如果是封装成库让别人使用,应该抛出异常 或 返回错误代码,让用户自己看情况处理
对于调用者的错误,有时,出于效率等的考虑,也可以不处理此类情况,例如:strcpy()
等等
优点
- 异常可以自动向上层栈传递
- 除非手动忽略,否则,必须处理所有异常
- 异常不会占据参数 或 返回值
- 异常可以携带更多的信息
- 可以在构造函数中抛出异常
- 可以使用面向对象构建自己的异常体系
- 异常类型是强类型的,
int
不会匹到double
- 不发生异常时,额外的时间开销几乎为零
缺点
- 会有一些空间开销
优点:
- 没有额外的时间 和 空间开销
缺点:
- 必须手动检测函数是否出错,如果漏掉某一个,可能导致程序带错误运行
- 检测每一个出错的函数很麻烦
- 错误代码会占据函数的返回值,而有的函数的返回值有约定,比如,赋值运算符
- 错误代码,只能说明,函数出错,不能说明是出了什么错误
- 无法处理构造函数的错误
所以: 个人建议,使用异常而不是错误代码