Python异常错误处理有更好的策略吗,python更好策略,Python 异常和错误
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 其实这句话就是把异常抓了,但什么操作都没做,所以广义上认为这样会没有将异常处理,认为这样是不好的。
编橙之家文章,
相关内容
- 什么方法可以将atom打造成python开发环境,atompython,打印
- 求Python读取大数据量XML文件优化方案,pythonxml,我用 m
- u5dfb\u4e3b这样的是python什么编码,u5dfbu4e3b,python(subje
- django安装第三方App路径及django框架存放在哪?,appdjang
- Linux更新Python3.3关于权限不够问题,python3.3权限不够,请
- 给virtualenv中python进行升级求方法,virtualenvpython,如题,
- 500服务器错误,flask sqlalchemy查询数据库500错误,flasksq
- Flask问题求助 No module named XXX怎么解决,flasknamed,第一个
- Python如何实现.py文件转换成.pyd文件,.py.pyd,因为需要,
- django参数资源项加载位置是哪里,django参数资源加载
评论关闭