关于“C++代码什么情况抛异常?什么时间捕获异常?”的一点个人理解
关于这个问题,我们首先要明确C++异常处理机制的主要目的,我认为是把不能明确要怎么处理的情况,及时抛出来,让明确怎么处理的调用者去处理,把异常的发现和处理解耦合,让库满足更多人的使用场景和的调用需求。
举个例子,C++标准库函数,std::stoi()、std::stoll()等,当输入参数为空字符串“”时,就会抛出异常,原因是:库的提供者不知道该返回什么满足更多情况下的使用,有的调用者想返回0,有的调用者想中断,有的调用者想返回其他值,返回0的话,没办法区分我们是输入了空字符串“”还是字符串“0”,库的调用者又不能改库的返回值,更好的方式就是抛个异常出来,当调用者明确要怎么处理时,就捕获该异常,根据自己的明确行为去做事情。明确要返回0的调用者你就catch后返回0,明确要终止程序的你就catch后终止程序,如果调用者也不明确,就不要去捕获该异常,让异常继续往上抛,知道有调用者明确行为后去捕获。
什么情况下抛异常?通过上面的分析,很容易发现,到一个条件下存在多个合理的处理情况即不能明确要怎么处理时,就抛异常。如果明确要怎么处理,就不应该抛异常,合理的做法是用if判断处理掉,这里也解释了异常和if else的区别和异常能不能用if else代替的问题。
什么时间捕获异常呢?同理,当你知道一个函数可能会抛异常,也知道会抛那些异常时,而调用者此时明确了这种情况下该怎么处理即把一个条件下的多种合理行为变成了一个合理行为时,就应该捕获处理掉,当然此时通过if判断也可以达到同样效果,如果调用者知道有异常,但是不知道怎么明确处理,就不要去捕获,让他继续往上抛,让其他明确知道怎么处理的调用者去捕获处理,千万不要见到异常就去捕获,会让代码调试成本大大增加,也不利于库的通用性。
异常和if else的区分,一个条件对应多个合理的行为,就抛异常,一个条件只有一种合理的行为,就应该用if判断,绝不抛异常。
欢迎讨论。