Skip to content

Commit 0172fb5

Browse files
committed
p3
1 parent d1e2e2b commit 0172fb5

File tree

3 files changed

+116
-42
lines changed

3 files changed

+116
-42
lines changed

217.md

Lines changed: 88 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
33
#错误和异常(2)
44

5-
try...except...是处理异常的基本方式。在原来的基础上,还可有扩展。
5+
###处理多个异常
66

7-
##处理多个异常
7+
`try...except...`是处理异常的基本方式。在此基础上,还可有扩展,能够处理多个异常。
88

9-
处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,有不同的except子句处理。
9+
处理多个异常,并不是因为同时报出多个异常。程序在运行中,只要遇到一个异常就会有反应,所以,每次捕获到的异常一定是一个。所谓处理多个异常的意思是可以容许捕获不同的异常,由不同的`except`子句处理。
10+
11+
Python 2:
1012

1113
#!/usr/bin/env python
1214
# coding=utf-8
@@ -29,6 +31,29 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
2931
else:
3032
break
3133

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+
3257
将上节的一个程序进行修改,增加了一个except子句,目的是如果用户输入的不是数字时,捕获并处理这个异常。测试如下:
3358

3459
$ python 21701.py
@@ -46,11 +71,10 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
4671
*************************
4772
this is a division program.
4873
input 'c' continue, otherwise logout:4
49-
$
5074

51-
如果有多个except,在try里面如果有一个异常,就转到相应的except子句,其它的忽略。如果except没有相应的异常,该异常也会抛出,不过这是程序就要中止了,因为异常“浮出”程序顶部。
75+
如果有多个`except`,try里面遇到一个异常,就转到相应的`except`子句,其它的忽略。如果`except`没有相应的异常,该异常也会抛出,不过这是程序就要中止了,因为异常“浮出”程序顶部。
5276

53-
除了用多个except之外,还可以在一个except后面放多个异常参数,比如上面的程序,可以将except部分修改为
77+
除了用多个`except`之外,还可以在一个`except`后面放多个异常参数,比如上面的程序,可以将`except`部分修改为
5478

5579
except (ZeroDivisionError, ValueError):
5680
print "please input rightly."
@@ -75,9 +99,13 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
7599
input 'c' continue, otherwise logout:d
76100
$
77101

78-
需要注意的是,except后面如果是多个参数,一定要用圆括号包裹起来。否则,后果自负。
102+
需要注意的是,`except`后面如果是多个参数,一定要用圆括号包裹起来。否则,后果自负。
79103

80-
突然有一种想法,在对异常的处理中,前面都是自己写一个提示语,发现自己写的不如内置的异常错误提示更好。希望把它打印出来。但是程序还能不能中断。python提供了一种方式,将上面代码修改如下:
104+
在对异常的处理中,前面都是自己写一个提示语,发现自己写的不如内置的异常错误提示好。希望把它打印出来。但是程序还能不能中断,怎么办?
105+
106+
Python提供了一种方式,将上面代码修改如下:
107+
108+
Python 2:
81109

82110
while 1:
83111
print "this is a division program."
@@ -94,6 +122,23 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
94122
else:
95123
break
96124

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+
97142
运行一下,看看提示信息。
98143

99144
$ python 21702.py
@@ -113,16 +158,16 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
113158
input 'c' continue, otherwise logout:d
114159
$
115160

116-
>在python3.x中,常常这样写:`except (ZeroDivisionError, ValueError) as e:`
161+
注意Python 3中的写法`except (ZeroDivisionError, ValueError) as e:`
117162

118-
以上程序中,之处理了两个异常,还可能有更多的异常呢?如果要处理,怎么办?可以这样:`execpt:`或者`except Exception, e`,后面什么参数也不写就好了。
163+
在上面程序中,只处理了两个异常,还可能有更多的异常,如果要处理,怎么办?可以这样:`execpt:`或者`except Exception, e``except Exception as e`,后面什么参数也不写就好了。
119164

120-
##else子句
165+
###else子句
121166

122-
有了`try...except...`,在一般情况下是够用的,但总有不一般的时候出现,所以,就增加了一个else子句。其实,人类的自然语言何尝不是如此呢?总要根据需要添加不少东西。
167+
有了`try...except...`,在一般情况下是够用的,但总有不一般的时候出现,所以,就增加了一个`else`子句。其实,人类的自然语言何尝不是如此呢?总要根据需要添加不少东西。
123168

124169
>>> try:
125-
... print "I am try"
170+
... print "I am try" #Python 3: print("I am try"),下同,从略
126171
... except:
127172
... print "I am except"
128173
... else:
@@ -131,7 +176,7 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
131176
I am try
132177
I am else
133178

134-
这段演示,能够帮助读者理解else的执行特点。如果执行了try,则except被忽略,但是else被执行。
179+
这段演示,能够帮助读者理解else的执行特点。如果执行了`try`,则`except`被忽略,但是else被执行。
135180

136181
>>> try:
137182
... print 1/0
@@ -144,9 +189,11 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
144189

145190
这时候else就不被执行了。
146191

147-
理解了else的执行特点,可以写这样一段程序,还是类似于前面的计算,只不过这次要求,如果输入的有误,就不断要求从新输入,知道输入正确,并得到了结果,才不再要求输入内容,程序结束
192+
理解了else的执行特点,可以写这样一段程序,还是类似于前面的计算,只是如果输入的有误,就不断要求从新输入,直到输入正确并得到了结果,才不再要求输入内容,然后程序结束
148193

149-
在看下面的参考代码之前,读者是否可以先自己写一段呢?并调试一下,看看结果如何。
194+
在看下面的参考代码之前,读者是否可以先自己写一段并调试?看看结果如何。
195+
196+
Python 2:
150197

151198
#!/usr/bin/env python
152199
# coding=utf-8
@@ -163,6 +210,23 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
163210
else:
164211
break
165212

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+
166230
先看运行结果:
167231

168232
$ python 21703.py
@@ -177,37 +241,36 @@ try...except...是处理异常的基本方式。在原来的基础上,还可
177241
the first number:4
178242
the second number:2 #正常,执行try
179243
2.0 #然后else:break,退出程序
180-
$
181244

182245
相当满意的执行结果。
183246

184-
需要对程序中的except简单说明,这次没有像前面那样写,而是`except Exception, e`,意思是不管什么异常,这里都会捕获,并且传给变量e,然后用`print e`把异常信息打印出来。
247+
程序中的`except Exception, e``except Exception as e:`的含义是不管什么异常,这里都会捕获,并且传给变量`e`,然后用`print e`或者`print(e)`把异常信息打印出来。
185248

186-
##finally
249+
###finally
187250

188-
finally子句,一听这个名字,就感觉它是做善后工作的。的确如此,如果有了finally,不管前面执行的是try,还是except,它都要执行。因此一种说法是用finally用来在可能的异常后进行清理。比如:
251+
`finally`子句,一听这个名字,就感觉它是做善后工作的。的确如此,如果有了`finally`,不管前面执行的是`try`,还是`except`,最终都要执行它。因此一种说法是将`finally`用在可能的异常后进行清理。比如:
189252

190253
>>> x = 10
191254

192255
>>> try:
193256
... 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)
196259
... finally:
197-
... print "del x"
260+
... print "del x" #Python 3: print(e)
198261
... del x
199262
...
200263
integer division or modulo by zero
201264
del x
202265

203-
看一看x是否被删除
266+
看一看`x`是否被删除
204267

205268
>>> x
206269
Traceback (most recent call last):
207270
File "<stdin>", line 1, in <module>
208271
NameError: name 'x' is not defined
209272

210-
当然,在应用中,可以将上面的各个子句都综合起来使用,写成如下样式:
273+
当然,在应用中可以将上面的各个子句都综合起来使用,写成如下样式:
211274

212275
try:
213276
do something
@@ -217,10 +280,6 @@ finally子句,一听这个名字,就感觉它是做善后工作的。的确
217280
do something
218281
finally
219282
do something
220-
221-
##和条件语句相比
222-
223-
`try...except...`在某些情况下能够替代`if...else..`的条件语句。这里我无意去比较两者的性能,因为看到有人讨论这个问题。我个人觉得这不是主要的,因为它们之间性能的差异不大。主要是你的选择。一切要根据实际情况而定,不是说用一个就能包打天下。
224283

225284
------
226285

2code/21701.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,24 @@
66
"""
77

88
while 1:
9-
print "this is a division program."
10-
c = raw_input("input 'c' continue, otherwise logout:")
9+
print("this is a division program.")
10+
c = input("input 'c' continue, otherwise logout:")
1111
if c == 'c':
12-
a = raw_input("first number:")
13-
b = raw_input("second number:")
12+
a = input("first number:")
13+
b = input("second number:")
1414
try:
15-
print float(a)/float(b)
16-
print "*************************"
15+
print(float(a)/float(b))
16+
print("*************************")
1717
#except ZeroDivisionError:
18-
# print "The second number can't be zero!"
19-
# print "*************************"
18+
# print("The second number can't be zero!")
19+
# print("*************************")
2020
#except ValueError:
21-
# print "please input number."
22-
# print "************************"
23-
except (ZeroDivisionError, ValueError):
24-
print "please input rightly."
25-
print "********************"
21+
# print("please input number.")
22+
# print("************************")
23+
except (ZeroDivisionError, ValueError) as e:
24+
print(e)
25+
#print("please input rightly.")
26+
print("********************")
2627
else:
2728
break
2829

2code/21703p3.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
while 1:
4+
try:
5+
x = input("the first number:")
6+
y = input("the second number:")
7+
8+
r = float(x)/float(y)
9+
print(r)
10+
except Exception as e:
11+
print(e)
12+
print("try again.")
13+
else:
14+
break

0 commit comments

Comments
 (0)