为了更好的了解异常处理,可以查看官方文档,第八章。
The Python Tutorial
Errors and Exceptions
在官方文档的documentation里面,我用的时python3.6.8,查看Tutorital.
这个例子便于我们理解抛出异常,
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
输出:
B
C
D
直接看例子发现还有些难懂,我们举几个简单例子:
首先,try-except-finally与raise有什么区别?
#try…except…finally ===== 捕获异常
#raise ====== 抛出异常
举例:
age = int(input('age:'))
class AgeError(Exception):
pass
if age < 0 or age > 120:
raise AgeError #抛出AgeError错误
else:
print(age)
输出:
age:999
Traceback (most recent call last):
File "/home/kiosk/Documents/python/python1231/回家练习/05抛出异常.py", line 14, in <module>
raise AgeError
__main__.AgeError
改一下抛出的错误,错误叫Exception:
age = int(input('age:'))
class AgeError(Exception):
pass
if age < 0 or age > 120:
raise Exception
else:
print(age)
输出:
age:999
Traceback (most recent call last):
File "/home/kiosk/Documents/python/python1231/回家练习/05抛出异常.py", line 14, in <module>
raise Exception
Exception
现在就好理解官方范例了,
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls() # 分别抛出BCD错误
except D: # 如果是D错误打印D
print("D")
except C: # 如果是C错误打印C
print("C")
except B: # 如果是B错误打印B
print("B")
示例2:
理解异常处理的else
import sys
#/etc/passwd /etc/group
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
# 如果try语句中没有产生任何异常和错误, 才执行的语句;
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
为了读懂上面代码,先学习一下sys模块。
import sys
print(sys.argv)
# argv是一个列表, 第一个元素是脚本名称,后面是脚本后传入的参数;
# ['06_sys模块获取脚本传入的参数.py', '1', '2', '3']
# print(sys.argv[1:]) 不打印脚本名称
再回去看刚才的程序,
import sys
for arg in sys.argv[1:]:
try:
f = open(arg,'r') # 打开/etc/passwd
except OSError: # 如果报错OSError 打印cannot open /etc/passwd
print('cannot open ',arg)
else:
# 如果try语句中没有产生任何异常和错误, 才执行的语句;
print(arg,'has',len(f.readlines()),'lines') # 打印/etc/passwd has xx lines
f.close( ) # 关闭文档
按Alt + F12打开终端,当文件存在时:文件不存在时,