1
billgreen1 2018-07-29 17:25:06 +08:00
你这个程序,如果 try except 之间的代码比较多,出现 IOError 之外的,exception/error, 会出现什么情况?
|
2
coffeSlider 2018-07-29 17:28:53 +08:00 via Android
英语水平为 0 啊
|
3
zwh2698 2018-07-29 19:18:48 +08:00 via Android
作用域是多大,考虑一下
|
4
tukey OP @zwh2698 谢谢, 我把 finally 去掉,然后 finally 里的语句向前缩进 4 个空格,就不报错了。所以这两种情况对比,我就没搞懂。
|
5
xenme 2018-07-29 20:22:38 +08:00 via iPhone
楼上提到了作用域。
如果在 as 前面抛异常了,那么 as 可能都没内容。所以会挂 |
6
zhangpeter 2018-07-30 07:03:33 +08:00
else 和 finally 里不是同一个作用域,虽然语句缩进一样
|
7
tukey OP @zhangpeter 但是这样就可以,他们作用域是一个吗?
def handle(): ....try: ........f = open('./html/index.html', 'r') ....except IOError: ........s = 'xx' ........a = 11 ....else: ........s = 'pp' ........a = 22 ........f.close() print(a) print(s) handle() |
8
atz 2018-07-30 09:12:56 +08:00
一般打开文件用 with open("xxxxxx") as f:
|
10
zhangpeter 2018-07-30 11:18:59 +08:00
|
11
SimbaPeng 2018-07-30 11:54:51 +08:00
楼上的真的会 Python 么?别在这里误人子弟了,try, except,else,finally 这些都不会产生新的作用域好吧。楼主的问题应该是出现了未捕获到的异常,导致 s 和 a 的赋值语句并未执行,然后 finally 里的异常会覆盖掉 try 里的异常。
|
12
tukey OP @billgreen1
@SimbaPeng 感谢大家 ===================== 你是说我可能 try...except 中语句多的话,有一个异常没有捕获到,导致我 except IOError 和 else 中两个分支中的语句都没有执行,那么 finally 中的变量我就没有定义了。如果是这样的话,那么为什么我 7 楼中的程序没有 pycharm 提示呢?因为如果有一个异常没有捕获导致变量未定义的话。 ===================== try...except/else...finally 我个人的理解是这样的,try 无论是否有异常,都会选择 except 或者 else 中的一个分支执行(如果异常我都捕获到了),然后再执行 finally,所以在 except 和 else 分支中我都对变量进行了赋值,在 finally 中应该不涉及到 pycharm 的提示信息“赋值前就引用变量” |
14
tukey OP @SimbaPeng 不好意思,程序是下面这样的,print(a)放在和 try 并列的位置,不是在函数外面。我在 pycharm 中可以运行且编辑器未提示报错。
def handle(): ....try: ........f = open('./html/index.html', 'r') ....except IOError: ........s = 'xx' ........a = 11 ....else: ........s = 'pp' ........a = 22 ........f.close() ....print(a) ....print(s) handle() |
16
aimiyooo 2018-07-30 16:51:42 +08:00
1 楼正解,出现了除 IOError 异常的其他异常。顺便说下最好使用 with as 语法,这样就不用 close 了。如果像楼主这样写的话,close 应该写在 finally 里面。
|