Python中 try ... except (IOError) ... except: pass 这样的代码结构,符合语法逻辑吗?

希望这段代码执行的时候:如果遇到 IOError 的时候,print('IOError')。如果没有遇到 IOError,do something 出错(任何错误)也直接 pass。

try:
do something

except IOError:

print('IOError')

except:

pass


Python中 try ... except (IOError) ... except: pass 这样的代码结构,符合语法逻辑吗?

16 回复

符合语法逻辑


这种写法在语法上是不合法的。

Python的except子句必须明确指定要捕获的异常类型(或使用空括号()表示捕获所有异常)。你的代码片段except (IOError) ... except: pass存在两个问题:

  1. except (IOError) 后面缺少了冒号:和具体的处理代码块。
  2. 第二个except:后面直接跟了pass,这在语法上是正确的,但它必须跟在第一个完整的except子句之后,并且中间不能有...

正确的、符合你意图的代码结构应该是这样的:

try:
    # 这里放置可能引发异常的代码
    with open('somefile.txt', 'r') as f:
        content = f.read()
except IOError:
    # 专门处理IOError(或其子类,如FileNotFoundError)的代码块
    print("发生了IO错误(例如文件未找到或权限问题)")
except:
    # 捕获所有其他未被前面except捕获的异常
    # 注意:这种写法通常不推荐,因为它会隐藏你未预料到的错误
    pass

更推荐的、清晰的写法是:

try:
    with open('somefile.txt', 'r') as f:
        content = f.read()
except IOError as e:
    # 可以在这里记录或处理特定的IO错误
    print(f"IO错误详情: {e}")
except Exception as e:
    # 使用 Exception 比裸 except 更明确,它捕获所有非系统退出异常
    # 但依然建议谨慎使用,最好能具体处理已知的异常类型
    print(f"发生了其他错误: {e}")

总结一下关键点:

  • 每个except关键字后面必须跟一个异常类型(或为空except:)以及冒号:
  • 可以使用元组同时捕获多种异常,例如except (IOError, ValueError):
  • except:(或except Exception:)应谨慎使用,避免隐藏潜在的程序逻辑错误。

一句话建议: 明确指定要捕获的异常类型,避免使用裸except来隐藏错误。

不都是这么干的吗…

看上去没问题……

没问题,不过最好不要用 print, 用 log

封装一个类似于 android 的 Log.e("",""); ?

except IOError as e:

可以捕捉到更加具体的异常信息

最后最好是 except Exception,要不然连 SystemExit 这种 BaesException 也会被 pass 掉

干活()
try:
下班()
except 产品经理改需求:
掏出菜刀摆桌上走人()
except:
pass
继续干活()

每天不都是这样的逻辑吗?你还能处理多大的异常?

pass 也是一种处理逻辑啊

有时候异常上层不一定要知道, 上层很可能完全不关心这里是不是错误了

不过 log 还是要打

except 是 exception 的缩写

👍

如果这段代码出错后直接 pass, 我觉得可以直接删了这段代码了, 毕竟也没什么用.

可以在日志里写个 io 异常哈哈哈哈哈哈

我倒是觉得 except 是动词,否则无法解释 except XXXXException as e: blablabla

回到顶部