Python异常错误处理有更好的策略吗,python更好策略,Python 异常和错误


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
以数组为例,比如读取数组下标越界,你的程序中并不期盼由此发展出功能 。

try:    data=array[x][y][z]except Exception:    data=None#   或者定义任何你不期盼发生的情况下的默认处理 

但是,假如你的程序设计里,数组的越界与否是 功能 具体实现的一部分,那么就应该使用if...else保证语义清晰。

if x< len(array):    if y< len(array[x]):    else:else:

但,也不是绝对,如果可视性与语义冲突,我个人以为 可视性>=语义清晰。比如简单而又易发的单句越界检查,即使越界在设计里是异常,但因为if的语句少过try,则我以为可以写if。
总的来说,raise就是把所有状态抛出,可以在任意上层处理,if...else 则是就地的代码分支.

异常处理当然 try/except

Why is “except: pass” a bad programming practice?

并不是在说 try/except 作为异常处理不好
这应该是在说 except 不catch具体的错误 pass 不处理错误不好
因为这等于一个异常处理的空壳, 并没有真的处理异常

try...except是异常处理,而if/else只是Flow控制,两者的概念和试用范围是不同的。就if-else而言,有些异常是可以通过判断来进行处理的,比如访问数组时,你输入的数组下标参数越界,这种情况你是可以通过if-else来检测,而直接用try..except的话,当下标越界时,你可能直接得到一个IndexError的异常。
两者也有明显的不同,也就是有些异常你可能无法直接通过if-else来进行判断,或者说if-else只能判断程序本身访问的资源是否正常,但对于非程序本身带来的异常,比如内存不够了,这些异常是由操作系统触发的,if-else是没法处理这样的异常的。
试想下面一个程序,你如果用if-else来判断:

if check_memory_is_available():  #在这个时间点,检查内存是可用的     init()  #运行完init()后,由于OS的内存是动态分配的,此时内存被其他的进程耗用光了,虚拟内存也没有了,再运行下面的long_time_run_start()是必然会有一个异常的     long_time_run_start()  else:     pass

stackoverflow里那个POST的意思是python的Built-in的异常是有一个结构关系的的,看图在这里 https://docs.python.org/2/library/exceptions.html:

BaseException    +-- SystemExit    +-- KeyboardInterrupt    +-- GeneratorExit    +-- Exception

由于catch的异常处理匹配是按照顺序来的,也就是说你处理异常应该先处理子类的异常,最后处理顶级的异常。这里有个帖子你可以看看http://ciniao.me/article.php?id=23
所以说except: pass 其实这句话就是把异常抓了,但什么操作都没做,所以广义上认为这样会没有将异常处理,认为这样是不好的。

编橙之家文章,

评论关闭