其实异常是个非常好的东西,但是滥用异常会让本来简单的代码变得很难维护。
先来看python中异常的用法,
try:
x = 0
y = 10 / x
except ZeroDivisionError as e:
print('x is zeor:', e)
else:
print('no error')
finally:
print('finally')
print('continue...')
Output:
x is zeor: division by zero
finally
continue...
这样写当然没什么问题,但是,想一下,如果你每写一个除法,就去捕获一个除数为零异常,那你的代码就是去了可读性。因为我们仅仅是做一个除法而已,却写了这么一大通代码。另一个理由是,除法这种运算太普遍了,几乎到处都会用到,如果每个都去处理,那么代码就写的很痛苦。
所以第一个观点是,这类代码这种很普遍,很简单的异常就不要去捕获它, 因为这类异常是我们在编写程序的时候可以控制的。比如说空指针,数组越界,除数为零。也就是说,我可以保证我的指针不空,数组不越界,除数不为零,这都是可以控制的。
那么是不是所有的异常都不用管了?当然也不是,比如说那些I/0异常,你在程序中就控制不了,比说从一个文件读数据,如果你要控制,那么首先要看文件在不在,不在那就连打开文件都做不到;如果在,那么你也不知道读出的数据到底是什么,这个是你控制不了的,所以必须要捕获它做出处理。
所以第二个观点是,那些在程序中不是完全可控的异常,我们就需要去捕获处理。
另外要知道:
异常的处理流程:如果一个异常发生了,在当前类没有被except捕获处理(或者捕获后,又抛出去了),那么这个异常就会被调用这个方法的调用方接收到。也就是说,异常会一层层向上传递,直到被捕获,程序继续运行或者一直不被捕获,程序终止。
异常发生了:怎么去看控制台的调用栈信息
第二个问题:到底该怎么去调试程序:最佳做法是logging 并且python内置了logging。
其实知道目前位置,我调试程序最喜欢的手段还是单步调试,我想了想,网上都说日志才是王道,肯定是有原因的。
总结了一下应该是这样的:
之前一直用java 如果想输出日志的话,那么内置的无外乎直接syso()或assert()。没错,非常的low。那么就需要第三方日志比如log4j,比较麻烦。加上当前写的都是一些算法,或者一些小程序,根本用不上log,所以觉得单步调试才是王道。
但是,当一个项目真正上线之后,你是不可能去完全复制出错误出现的情况,然后去单步调试的,因为你怎么能知道成千上万的用户到底做了哪些操作导致了异常呢。所以这个时候,记录着一些的日志就变得至关重要。
以上,只是个人的见解,希望能够让才接触异常和调试这些概念的新手在使用它们的时候不那么纠结,把更多的精力放在有效的编码上,才疏学浅,如有纰漏,敬请指正。