刚接触C++异常处理机制,一直认为异常机制就是为了将错误延后处理,
都是在某种条件下throw,等后面需要处理的时候再进行catch,
然后再处理,那如果在某种条件下直接处理掉,不就省去了throw, try{}catch(){}的繁琐过程了吗,
所以片面地认为,if else语句完全可以代替exception。
把所有的可能情况都判断处理了,就不需要抛异常了,所以code中都是多判断少抛异常。
随着code经验的增加和exception的使用,我发现,我的理解非常片面,甚至是错误的,
我并没有理解exception机制的本质和重要作用,if else 代替不了exception。
我认为异常处理机制的本质并不是将异常延后处理,
而是把没办法确定要怎么处理的意外情况及时抛出,直到调用者明确要怎么处理时,再去处理,
如果调用者不能明确怎么处理,就应该接着往上抛,直到有调用者明确行为后再处理;
例如:
std::stoi() 、std::stoll()等标准库函数,当传入空字符串时会抛异常。
为什么不在函数中判断输入是不是空字符串后处理掉呢?反而抛出异常让我们去处理,
理解了异常机制的本质,这个问题的答案就出现了:
当输入为空时,应该返回什么呢?如果返回0,那么我们怎么判断是传了空字符串""还是传了“0”字符串呢?
这种情况函数的提供者没办法明确要怎么处理,于是他就直接抛异常出来,让调用者自己去处理。
如上,调用者自己处理,可以继续抛,可以让程序中断,也可以返回明确的值。
浅显的个人理解,欢迎交流指正,谢谢阅读。