python中有关异常处理的求教?

论坛 期权论坛 工作     
爱用户   2019-10-11 13:20   3489   5
  • 有时我们写了一个函数,这个函数只能处理 dict 类型的数据,如果不是dict将会产生错误的结果,可能造成严重错误。大家会使用
    1. assert isinstance()
    复制代码
    还是
    1. if isinstance()
    复制代码
    我感觉这两者没啥区别,看看大家的意见。
  • 关于 try ... except ... 和 if 判断。 例如判断一个文件是否存在,stackoverflow 上的最佳回答是
    1. try:
    2.    with open('filename'): pass
    3. except IOError:
    4.    print 'Oh dear.'
    复制代码
    他的解释是防止文件发生改变,而没有选用 if 判断。那么时候该使用 try 的 这种形式,什么时候使用 if 判断呢?我现在的理解是对于一些共享资源,例如文件,数据库,必须使用 try。关于什么情况下使用 try 什么情况下不能使用,和什么情况使用 if 判断有什么观点
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-10-11 13:20:11 发帖IP地址来自
1. assert 的语义要好一些,对入参的类型约束是一种契约,当然在静态类型语言里面是通过类型检查保证的,如果 assert 可能被优化选项消除,那么就造一个不会被消除的设施,比如 ensure(D 语言里面就是这个),这个比 if 好,if 是正常逻辑,ensure/assert 提示读者:这是一个契约

2. 简单说,凡是异常就应该用 try-catch,凡不是异常就该用 if,当然这是废话……大体上,如果这个调用有对应的 C 调用,manpage 里面返回值是错误的情况应该用异常,正常返回值的情况应该用 if。题主举的例子,不仅在技术上应该用 try-catch,因为 if 判断可能失效,就是在语义上也应该用 try-catch,因为那确实是异常。
3#
热心回应  16级独孤 | 2019-10-11 13:20:12 发帖IP地址来自

4#
热心回应  16级独孤 | 2019-10-11 13:20:13 发帖IP地址来自
  • “这个函数只能处理 dict 类型的数据,如果不是dict将会产生错误的结果。”对这种情况,肯定是用 if,但 if 并不是重点,if 块的内容才是重点。pythonista 会这样写:if not instance(...):raise MyError(...),以确保“错误的结果”不会发生。
  • 什么时候用 try,什么时候用 if。一个简单的原则:大部分时候都会成功(即用 if 的话条件表达式为 True),就用 try;大部分时候会失败(即用 try 的时候会抛出异常),就用 if。
5#
热心回应  16级独孤 | 2019-10-11 13:20:14 发帖IP地址来自
可控的用if
不可控的用异常

e.g. 比如打开文件,这个是不可控的,所以用异常
6#
热心回应  16级独孤 | 2019-10-11 13:20:15 发帖IP地址来自
1.异常是处理我们正常的处理流程以外的东西。
2.if是用于我们正常的判断流程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:31799
帖子:6375
精华:1
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP