Python 异常和错误处理时,try...except
、if...else...
哪个更好一些,为什么?
The point is that using try/except statements is in many cases much more natural (more “Pythonic”) than if/else, and you should get into the habit of using them where you can.
这个是《Beginning Python From Novice to Professional, 2nd Edition》里的原话,但 StackOverflow 里又有
Why is “except: pass” a bad programming practice?
我就疑惑了……到底哪个好一些?还是说有更好的方法?
try...except是异常处理,而if/else只是Flow控制,两者的概念和试用范围是不同的。就if-else而言,有些异常是可以通过判断来进行处理的,比如访问数组时,你输入的数组下标参数越界,这种情况你是可以通过if-else来检测,而直接用try..except的话,当下标越界时,你可能直接得到一个IndexError的异常。
两者也有明显的不同,也就是有些异常你可能无法直接通过if-else来进行判断,或者说if-else只能判断程序本身访问的资源是否正常,但对于非程序本身带来的异常,比如内存不够了,这些异常是由操作系统触发的,if-else是没法处理这样的异常的。
试想下面一个程序,你如果用if-else来判断:
stackoverflow里那个POST的意思是python的Built-in的异常是有一个结构关系的的,看图在这里 https://docs.python.org/2/library/exceptions.html:
由于catch的异常处理匹配是按照顺序来的,也就是说你处理异常应该先处理子类的异常,最后处理顶级的异常。这里有个帖子你可以看看http://ciniao.me/article.php?id=23
所以说except: pass 其实这句话就是把异常抓了,但什么操作都没做,所以广义上认为这样会没有将异常处理,认为这样是不好的。
异常的时候,使用try...except
正常的程序流程使用 if...else
以数组为例,比如读取数组下标越界,你的程序中并不期盼由此发展出功能 。
但是,假如你的程序设计里,数组的越界与否是 功能 具体实现的一部分,那么就应该使用if...else保证语义清晰。
但,也不是绝对,如果可视性与语义冲突,我个人以为 可视性>=语义清晰。比如简单而又易发的单句越界检查,即使越界在设计里是异常,但因为if的语句少过try,则我以为可以写if。
总的来说,raise就是把所有状态抛出,可以在任意上层处理,if...else 则是就地的代码分支.
异常处理当然 try/except
Why is “except: pass” a bad programming practice?
并不是在说 try/except 作为异常处理不好
这应该是在说 except 不catch具体的错误 pass 不处理错误不好
因为这等于一个异常处理的空壳, 并没有真的处理异常