异常处理-python进阶篇十一
Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except 代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
格式:
try:
可能出现异常的代码
except;
如果有异常执行的代码
else;
依赖于try 代码块成功执行的代码,不ba
[finally:
无论是否存在异常都会被执行的代码]
情况1:
try:
有可能会产生多种异常
except 异常类型1:
print(.....)
except 异常类型2:
print(.....)
except Exception;
pass
except Exception as err:
print('出错了!',err) # 可以输出上面没有的错误类型,但是系统的错误类型
如果是多个except,异常类型的顺序需要注意,最大的Exception要放到最后
情况2:获取Exception错误原因
try:
有可能会产生多种异常
except 异常类型1:
print(.....)
except 异常类型2:
print(.....)
except Exception as err:
print('出错了!',err) # 可以输出上面没有的错误类型,但是系统的错误类型
print(5/0)
Traceback (most recent call last):
File "division.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
1、使用try-except 代码块
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
2、使用try-except-else代码块
通过将可能引发错误的代码放在try-except 代码块中,可提高这个程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此我们需要将它放到try-except 代码块中。这个示例还包含一个else 代码块;依赖于try 代码块成功执行的代码都应放到else 代码块中:
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: ")
try: #尝试执行try 代码块中的除法运算
answer = int(first_number) / int(second_number)
except ZeroDivisionError: #except 代码块告诉Python,出现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: 0
You can't divide by 0!
First number: 5
Second number: 2
2.5
First number: q
'''
注意:如果代码中出现了return,else语句将不会执行。
3、处理FileNotFoundError 异常
使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本就不存在。
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)
如果缺少一个文件但是不想报错,就像什么都没有发生一样继续运行。个pass语句,可在代码块中使用它来让Python 什么都不要做。
def count_words(filename):
"""计算一个文件大致包含多少个单词"""
try:
--snip--
except FileNotFoundError:
pass #直接过,什么都不做
else:
--snip--
filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)
'''
The file alice.txt has about 29461 words.
The file moby_dick.txt has about 215136 words.
The file little_women.txt has about 189079 words.
'''
4、使用try-except-finally代码块
finally中的语句无论是否出现异常都会执行
def func():
stream = None
try:
stream = open(r'c:\pi\aa.txt')
container=stream.read()
print(container)
except Exception as err:
print(err)
finally: # 无论是否出现异常都会执行,即便上面出现了return也会执行
if stream:
stream.close()
func()