Joh*_*ang 16 c++ error-handling exception-handling
我们知道异常类有两个派生类:logic_error和runtime_error.
logic_error有四个派生类:定义域,invalid_argument,length_error和out_of_range.
runtime_error有三个派生类:range_error,overflow_error和underflow_error.
虽然其中一些是不言自明的,比如overflow_error和underflow_error,但有些并不是那么清楚,特别是range_error,MSDN和cplusplus都只是说"报告范围错误",这几乎没有说什么,它是多么不同out_of_range和domain_error ???
另一个问题是当我抛出异常时,我应该选择哪一个?例如,在reverse_string(char*s)中,当s为NULL时抛出哪个异常?在float calc_ellipse_area(float a,float b)中,当a或b <= 0时抛出?当a == b时(严格来说,圆圈不是椭圆!)?
最后,实际上,如果我抛出一个未正确分类的异常,真的很重要吗?
Mic*_*l J 12
逻辑错误是程序员错误的(理论上)结果.运行时错误是程序员无法轻易阻止的.
编写函数时,记录其前提条件和/或假设很有用.如果这些先决条件被破坏,那就是逻辑错误.
运行时错误通常是由外部因素引起的:文件操作失败,打印机脱机,无法加载DLL.
如果路径参数格式错误,那就是逻辑错误.如果它是有效的路径字符串,但不存在,或者您没有访问它的权限,那就是运行时错误.
有时它变得武断.糟糕的用户输入可能是运行时错误,但验证用户输入失败更多是逻辑错误.在特定情况下情况可能并不明显.
如果某事在2011年2月1日开始,则"2011年1月1日"的完成日期无效,而"2011年2月31日"超出范围."鱼和薯条"的完成日期是域错误.长度错误通常与缓冲区大小有关,但也可能包括太多或太少的输入数据或类似的东西.
除了上下文(运行时,而不是逻辑)之外,范围错误类似于超出范围的错误.例如,可用的打印机数量= 0.溢出和下溢或多或少都是不言自明的.
最后,以您和您的同事发现有意义的方式使用它们 - 或者根本不使用它们.有些人只是将std :: exception用于所有事情.
如果您要以不同方式处理不同的异常,这一点非常重要.如果您只是要显示(或记录)消息并继续,那么您使用的是什么异常并不重要.
例如,在reverse_string(char*s)中,当s为NULL时抛出哪个异常?
在float calc_ellipse_area(float a,float b)中,当a或b <= 0时抛出?当a == b时(严格来说,圆圈不是椭圆!)?
对于这两种情况,请使用std::invalid_argument.
或者,您可以定义自己的异常,称为null_argument派生自std::logic_error(或来自std::invalid_argument),并将其用于NULL参数.
关键是如果标准异常类都不适用于您的情况,或者您想要更具体的异常,那么定义一个派生自现有类的异常.
例如,如果要在遇到无效索引时抛出异常,则可以使用std::out_of_range或定义更多特定的类,称为index_out_of_rangederived from std::out_of_range.
如果我抛出一个未正确分类的异常,这真的很重要吗?
是的,这很重要.例如,它提高了代码的可读性.如果std::logic_error在遇到无效索引时抛出,那么它不会增加可读性,但如果抛出std::out_of_range则不会增加,那么它会大大提高可读性.如果你扔index_out_of_range,它会增加更多,因为它更具体.
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |