异常处理 - Python:异常和错误的处理策略问题

 天秤aaaaaaa_150 发布于 2022-11-01 22:56

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?

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

3 个回答
  • 异常处理当然 try/except

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

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

    2022-11-02 21:51 回答
  • 异常的时候,使用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 则是就地的代码分支.

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

    2022-11-02 22:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有