异常处理 - Python:异常和错误的处理策略问题
天蓬老师
天蓬老师 2017-04-17 14:30:55
0
3
350

Python 异常和错误处理时,try...exceptif...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?

我就疑惑了……到底哪个好一些?还是说有更好的方法?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

reply all (3)
黄舟

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 其实这句话就是把异常抓了,但什么操作都没做,所以广义上认为这样会没有将异常处理,认为这样是不好的。

    Peter_Zhu

    异常的时候,使用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 不处理错误不好
      因为这等于一个异常处理的空壳, 并没有真的处理异常

        Latest Downloads
        More>
        Web Effects
        Website Source Code
        Website Materials
        Front End Template
        About us Disclaimer Sitemap
        php.cn:Public welfare online PHP training,Help PHP learners grow quickly!