2
2
3
3
#错误和异常(2)
4
4
5
- try...except...是处理异常的基本方式。在原来的基础上,还可有扩展。
5
+ ###处理多个异常
6
6
7
- ##处理多个异常
7
+ ` try...except... ` 是处理异常的基本方式。在此基础上,还可有扩展,能够处理多个异常。
8
8
9
- 处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,有不同的except子句处理。
9
+ 处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,由不同的` except ` 子句处理。
10
+
11
+ Python 2:
10
12
11
13
#!/usr/bin/env python
12
14
# coding=utf-8
@@ -29,6 +31,29 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
29
31
else:
30
32
break
31
33
34
+ Python 3:
35
+
36
+ #!/usr/bin/env python
37
+ # coding=utf-8
38
+
39
+ while 1:
40
+ print("this is a division program.")
41
+ c = input("input 'c' continue, otherwise logout:")
42
+ if c == 'c':
43
+ a = input("first number:")
44
+ b = input("second number:")
45
+ try:
46
+ print(float(a)/float(b))
47
+ print("*************************")
48
+ except ZeroDivisionError:
49
+ print("The second number can't be zero!")
50
+ print("*************************")
51
+ except ValueError:
52
+ print("please input number.")
53
+ print("************************")
54
+ else:
55
+ break
56
+
32
57
将上节的一个程序进行修改,增加了一个except子句,目的是如果用户输入的不是数字时,捕获并处理这个异常。测试如下:
33
58
34
59
$ python 21701.py
@@ -46,11 +71,10 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
46
71
*************************
47
72
this is a division program.
48
73
input 'c' continue, otherwise logout:4
49
- $
50
74
51
- 如果有多个except,在try里面如果有一个异常,就转到相应的except子句 ,其它的忽略。如果except没有相应的异常 ,该异常也会抛出,不过这是程序就要中止了,因为异常“浮出”程序顶部。
75
+ 如果有多个 ` except ` ,try里面遇到一个异常,就转到相应的 ` except ` 子句 ,其它的忽略。如果 ` except ` 没有相应的异常 ,该异常也会抛出,不过这是程序就要中止了,因为异常“浮出”程序顶部。
52
76
53
- 除了用多个except之外,还可以在一个except后面放多个异常参数 ,比如上面的程序,可以将except部分修改为 :
77
+ 除了用多个 ` except ` 之外,还可以在一个 ` except ` 后面放多个异常参数 ,比如上面的程序,可以将 ` except ` 部分修改为 :
54
78
55
79
except (ZeroDivisionError, ValueError):
56
80
print "please input rightly."
@@ -75,9 +99,13 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
75
99
input 'c' continue, otherwise logout:d
76
100
$
77
101
78
- 需要注意的是,except后面如果是多个参数 ,一定要用圆括号包裹起来。否则,后果自负。
102
+ 需要注意的是,` except ` 后面如果是多个参数 ,一定要用圆括号包裹起来。否则,后果自负。
79
103
80
- 突然有一种想法,在对异常的处理中,前面都是自己写一个提示语,发现自己写的不如内置的异常错误提示更好。希望把它打印出来。但是程序还能不能中断。python提供了一种方式,将上面代码修改如下:
104
+ 在对异常的处理中,前面都是自己写一个提示语,发现自己写的不如内置的异常错误提示好。希望把它打印出来。但是程序还能不能中断,怎么办?
105
+
106
+ Python提供了一种方式,将上面代码修改如下:
107
+
108
+ Python 2:
81
109
82
110
while 1:
83
111
print "this is a division program."
@@ -94,6 +122,23 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
94
122
else:
95
123
break
96
124
125
+ Python 3:
126
+
127
+ while 1:
128
+ print("this is a division program.")
129
+ c = input("input 'c' continue, otherwise logout:")
130
+ if c == 'c':
131
+ a = input("first number:")
132
+ b = input("second number:")
133
+ try:
134
+ print(float(a)/float(b))
135
+ print("*************************")
136
+ except (ZeroDivisionError, ValueError) as e:
137
+ print(e)
138
+ print("********************")
139
+ else:
140
+ break
141
+
97
142
运行一下,看看提示信息。
98
143
99
144
$ python 21702.py
@@ -113,16 +158,16 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
113
158
input 'c' continue, otherwise logout:d
114
159
$
115
160
116
- > 在python3.x中,常常这样写: ` except (ZeroDivisionError, ValueError) as e: `
161
+ 注意Python 3中的写法 ` except (ZeroDivisionError, ValueError) as e: `
117
162
118
- 以上程序中,之处理了两个异常,还可能有更多的异常呢? 如果要处理,怎么办?可以这样:` execpt: ` 或者` except Exception, e ` ,后面什么参数也不写就好了。
163
+ 在上面程序中,只处理了两个异常,还可能有更多的异常, 如果要处理,怎么办?可以这样:` execpt: ` 或者` except Exception, e ` 、 ` except Exception as e` ,后面什么参数也不写就好了。
119
164
120
- ##else子句
165
+ ### else子句
121
166
122
- 有了` try...except... ` ,在一般情况下是够用的,但总有不一般的时候出现,所以,就增加了一个else子句 。其实,人类的自然语言何尝不是如此呢?总要根据需要添加不少东西。
167
+ 有了` try...except... ` ,在一般情况下是够用的,但总有不一般的时候出现,所以,就增加了一个 ` else ` 子句 。其实,人类的自然语言何尝不是如此呢?总要根据需要添加不少东西。
123
168
124
169
>>> try:
125
- ... print "I am try"
170
+ ... print "I am try" #Python 3: print("I am try"),下同,从略
126
171
... except:
127
172
... print "I am except"
128
173
... else:
@@ -131,7 +176,7 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
131
176
I am try
132
177
I am else
133
178
134
- 这段演示,能够帮助读者理解else的执行特点。如果执行了try,则except被忽略 ,但是else被执行。
179
+ 这段演示,能够帮助读者理解else的执行特点。如果执行了 ` try ` ,则 ` except ` 被忽略 ,但是else被执行。
135
180
136
181
>>> try:
137
182
... print 1/0
@@ -144,9 +189,11 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
144
189
145
190
这时候else就不被执行了。
146
191
147
- 理解了else的执行特点,可以写这样一段程序,还是类似于前面的计算,只不过这次要求,如果输入的有误, 就不断要求从新输入,知道输入正确,并得到了结果, 才不再要求输入内容,程序结束 。
192
+ 理解了else的执行特点,可以写这样一段程序,还是类似于前面的计算,只是如果输入的有误, 就不断要求从新输入,直到输入正确并得到了结果, 才不再要求输入内容,然后程序结束 。
148
193
149
- 在看下面的参考代码之前,读者是否可以先自己写一段呢?并调试一下,看看结果如何。
194
+ 在看下面的参考代码之前,读者是否可以先自己写一段并调试?看看结果如何。
195
+
196
+ Python 2:
150
197
151
198
#!/usr/bin/env python
152
199
# coding=utf-8
@@ -163,6 +210,23 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
163
210
else:
164
211
break
165
212
213
+ Python 3:
214
+
215
+ #!/usr/bin/env python
216
+ # coding=utf-8
217
+ while 1:
218
+ try:
219
+ x = input("the first number:")
220
+ y = input("the second number:")
221
+
222
+ r = float(x)/float(y)
223
+ print(r)
224
+ except Exception as e:
225
+ print(e)
226
+ print("try again.")
227
+ else:
228
+ break
229
+
166
230
先看运行结果:
167
231
168
232
$ python 21703.py
@@ -177,37 +241,36 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
177
241
the first number:4
178
242
the second number:2 #正常,执行try
179
243
2.0 #然后else:break,退出程序
180
- $
181
244
182
245
相当满意的执行结果。
183
246
184
- 需要对程序中的except简单说明,这次没有像前面那样写,而是 ` except Exception, e ` ,意思是不管什么异常, 这里都会捕获,并且传给变量e ,然后用` print e ` 把异常信息打印出来。
247
+ 程序中的 ` except Exception, e ` 或 ` except Exception as e: ` 的含义是不管什么异常, 这里都会捕获,并且传给变量 ` e ` ,然后用` print e ` 或者 ` print(e) ` 把异常信息打印出来。
185
248
186
- ##finally
249
+ ### finally
187
250
188
- finally子句 ,一听这个名字,就感觉它是做善后工作的。的确如此,如果有了finally,不管前面执行的是try,还是except,它都要执行。因此一种说法是用finally用来在可能的异常后进行清理 。比如:
251
+ ` finally ` 子句 ,一听这个名字,就感觉它是做善后工作的。的确如此,如果有了 ` finally ` ,不管前面执行的是 ` try ` ,还是 ` except ` ,最终都要执行它。因此一种说法是将 ` finally ` 用在可能的异常后进行清理 。比如:
189
252
190
253
>>> x = 10
191
254
192
255
>>> try:
193
256
... x = 1/0
194
- ... except Exception, e:
195
- ... print e
257
+ ... except Exception, e: #Python 3: except Exception as e:
258
+ ... print e #Python 3: print(e)
196
259
... finally:
197
- ... print "del x"
260
+ ... print "del x" #Python 3: print(e)
198
261
... del x
199
262
...
200
263
integer division or modulo by zero
201
264
del x
202
265
203
- 看一看x是否被删除 ?
266
+ 看一看 ` x ` 是否被删除 ?
204
267
205
268
>>> x
206
269
Traceback (most recent call last):
207
270
File "<stdin>", line 1, in <module>
208
271
NameError: name 'x' is not defined
209
272
210
- 当然,在应用中,可以将上面的各个子句都综合起来使用 ,写成如下样式:
273
+ 当然,在应用中可以将上面的各个子句都综合起来使用 ,写成如下样式:
211
274
212
275
try:
213
276
do something
@@ -217,10 +280,6 @@ finally子句,一听这个名字,就感觉它是做善后工作的。的确
217
280
do something
218
281
finally
219
282
do something
220
-
221
- ##和条件语句相比
222
-
223
- ` try...except... ` 在某些情况下能够替代` if...else.. ` 的条件语句。这里我无意去比较两者的性能,因为看到有人讨论这个问题。我个人觉得这不是主要的,因为它们之间性能的差异不大。主要是你的选择。一切要根据实际情况而定,不是说用一个就能包打天下。
224
283
225
284
------
226
285
0 commit comments