异常处理?

这里说的异常处理特指编程语言的异常处理。长期编程,其实一直有这个疑问,最近简单过了下 go语言 ,发现go语言就不支持异常处理,又引发了下这个思考。

为什么需要异常处理?

这是个疑问,没有解答。

初学编程的时候,貌似根本不知道什么是异常处理。也可能入门语言是C有关,C语言一般认为是不支持异常处理的,同样go语言也是。这里说的不支持算是编程语言原生的特性中没异常处理,但如果想加这个机制也不是不可以,只不过没有原生支持,要实现这个机制会麻烦些,会多出一些代码;不像有原生支持的语言,如:Java、Python等有现成语法。

当编程有一定经验了,貌似知道写程序要有异常处理这玩意儿了。接触了其它编程语言很多也都支持异常处理。常见的如:文件操作、网络操作这些I/O操作的异常处理;加减乘除操作等数值操作的异常处理。

现在想来,有些编程用到的技术、思想,比如:异常处理、面向对象,区别也就是是否有语言层面的支持而已。如果缺乏语言层面的支持,但能为了编程更有效率,去实现也未尝不可,只不过实现的优雅或拙劣而已。

异常处理通常就是程序的执行流程,不在预先设想的流程中了,需要通过异常处理的机制来纠正。但既然这样,为什么不用错误检测来替代异常处理呢?既然考虑到了某种情况需要有异常处理,那用错误检查来纠正不也一样吗?

错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束

没有异常处理不可以吗?

程序员A:打开个文件要有个文件不存在的异常处理。
程序员B:那在打开前判断文件是否存在的错误检测,不就省去这个异常处理了吗。
程序员A:那socket超时需要异常处理。
程序员B:那具体执行函数或方法返回一个状态值表示超时不行吗?
程序员A:没做这些异常处理我不放心。
程序员B:但做了对应的错误检测了。
程序员A:错误检测不能涵盖所有错误情况。
程序员B:那异常处理也同样不能涵盖所有异常情况。
程序员A:异常处理是程序运行的一个分支。
程序员B:那为什么不用错误检测,多出一个if判断错误检测的分支来替代。
程序员A:...
程序员B:...

最后对话没有结果。

怎么异常处理?

有两种编程思路:

  • 考虑程序各个可能分支,考虑各种异常情况,加了一堆异常处理。
  • 写个程序主流程,不考虑那么完备的异常处理,等有必要时候再加。

自己更倾向于后一种,理由是很难预测清楚程序在所有情况下的运行,有些情况根本执行不到,做了异常处理根本是无用功;还有就是加了过多的异常处理,隐藏了程序的根本问题,而被异常处理掉了,不利于问题的暴露。

所以甚至会这样,写了大段程序后,没有异常处理,如果一直运行正常,那就不加,如果运行不正常,那么就一定有没考虑的情况,就可以考虑通过什么方式处理这种情况。

倾向于后者的目的在于,把程序该暴露的问题都暴露了。所以:

  • 异常处理要慎用,用了也得有足够理由。
  • 忌用全局包围式的、不明确的异常处理,比如直接try…except…那种。