当 Python 编写的程序发生异常时,程序会自动停止并抛出异常报告,Shell 也是这样的,如果使用一种方法来处理异常,可以做到跳过异常继续执行程序。
在 Python 中处理异常使用了 try-except
代码块处理。try-except
代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时该怎么办。这样可以让程序发生异常后仍继续运行。
ZeroDivisionError 异常
Zero Division Error 英文翻译过来叫 零除错误,其实就是在数学中,零不能做除数,当这么做了之后,就会抛出这个异常。
print(26/0)
# 执行后
Traceback (most recent call last):
File "/Users/feiyi/Documents/Study/Python/study.py", line 234, in <module>
print(26/0)
ZeroDivisionError: division by zero
使用 try-except
代码块来处理该异常。
try:
print(26/0)
except ZeroDivisionError:
print("0不可以做除数")
将执行的代码放到 try 的缩进下,如果执行成功,将跳过 except,如果执行后创建了 ZeroDivisionError
这个对象,也就是 try 中的代码执行之后报错 ZeroDivisionError
,将会执行 except 部分的输出。
这样可以让用户看到报错后明显知道原因,也可以不必非要停止程序,其实处理异常也就是将用户看不懂的报错输出转换为可读懂的输出,增加了报错可读性。
小实验
要求用户一次输入两个数字,做除法运算,当第二个数字为0是会抛出 ZeroDivisionError
异常,并用 try-except
做处理。
print("请输入两个数字,我将计算他们的商")
print("输入 q 退出")
while True:
first_num = input("请输入第一个数字,它将作为被除数: ")
if first_num == "q":
break
second_num = input("请输入第二个数字,它将作为除数 : ")
if second_num == "q":
break
try:
print(int(first_num)/int(second_num))
except ZeroDivisionError:
print("第二个数字不可以为0哦!")
try-except-else
以上述代码为例进行else的使用
print("请输入两个数字,我将计算他们的商")
print("输入 q 退出")
while True:
first_num = input("请输入第一个数字,它将作为被除数: ")
if first_num == "q":
break
second_num = input("请输入第二个数字,它将作为除数 : ")
if second_num == "q":
break
try:
result = int(first_num)/int(second_num)
except ZeroDivisionError:
print("第二个数字不可以为0哦!")
except ValueError: # 这里我新增了一个异常处理,我在输入数字时不小心按了方向键后抛出了该异常
print("包含非法字符")
else:
print(result)
以上 try-except-else 代码块部分表示,try 执行成功后,执行 else,抛出异常后,在 except 中寻找对应异常对象进行处理。
在进行 Python 代码编写调试时,有可能在使用过程中发生异常的地方,模拟异常并做相应处理即可。
忽略报错
如果在抛出异常时,希望程序默不作声,不做处理,也不提示用户任何信息,在 except 中可以使用 pass,如:
try:
result = int(first_num)/int(second_num)
except ZeroDivisionError:
pass
练习文件异常处理
创建2个文件 cats.txt 和 dogs.txt,每个文件至少存储 3 行数据,分别为猫和狗的种类。
with open('cats.txt', 'w') as cat:
cat.write("波斯猫\n")
cat.write("英短\n")
cat.write("折耳猫\n")
with open('dogs.txt', 'w') as dog:
dog.write("博美\n")
dog.write("二哈\n")
dog.write("阿拉斯加\n")
filename = 'cats.txt'
try:
with open(filename) as cat:
print(cat.read())
except FileNotFoundError:
print(filename + " 文件不存在,请检查!")
filename = 'dogs.txt'
with open('dogs.txt') as dog:
print(dog.read())