异常
一些引言:
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行,否则,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的。try-excpet代码块让Python执行指定的操作,同时报告Python发生异常时怎么办。使用了try-except代码块,即时出现异常,程序也将继续运行,显示你编写的友好的错误信息,而不是令用户迷惑的traceback。
我们都知道,除数不能为0,如果python里做了会怎样呢
print(5/0)
程序会报错,显示为ZeroDivisionError型异常
ZeroDivisionError Traceback (most recent call last)
<ipython-input-4-fad870a50e27> in <module>
----> 1 print(5/0)
ZeroDivisionError: division by zero
把可能会出现错误的地方放入try语句中,如果出现了错误则会执行except的内容
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
输出效果为:
You can't divide by zero!
这样的报错就很清晰易懂
同样的,try-except语句还可加包含else,形成try-except-else
try代码执行成功的话则执行else部分,出错则执行excpet部分,使得代码的逻辑更清晰。接下来看一个示例程序
print("Give me two numbers, and I'll divide them.")
print("Enter q to quit.")
while True:
first_number = input("\nFirst number:")
if first_number == 'q':
break
second_number = input("Second number:")
if second_number == 'q':
break
try:
answer = int(first_number)/int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
最后输出的效果
Give me two numbers, and I'll divide them.
Enter q to quit.
First number:5
Second number:2
2.5
First number:3
Second number:9
0.3333333333333333
First number:8
Second number:0
You can't divide by 0!
First number:8
Second number:q
除了ZeroDivisionError型异常,还有FileNotFoundError型异常 ,也就是找不到文件
我们试着去找一个不存在的文件
filename = 'alice.txt'
with open('filename') as f_obj:
contents = f_obj.read()
出现了这样的报错
FileNotFoundError Traceback (most recent call last)
<ipython-input-10-56788d61a43c> in <module>
1 filename = 'alice.txt'
2
----> 3 with open('filename') as f_obj:
4 contents = f_obj.read()
FileNotFoundError: [Errno 2] No such file or directory: 'filename'
这个错误是oepn()函数导致的,所以为了读的更清晰,这个异常我们可以将其放入try语句中
filename = 'alice.txt'
try:
with open('filename') as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file "+filename+" does not exist."
print(msg)
输出效果为:
Sorry, the file alice.txt does not exist.
另外,我们还可以让python在语句出现错误时,一声不吭,要实现这个效果即可使用pass,将其放入except语句中。
格式如下
try:
...
except 某种类型错误的名字:
pass
else:
...