异常
异常:程序运行时发生的错误。
–----通常会导致程序突然停止
追溯:是一条错误消息,它提供导致异常的行号信息。(可以看出是哪条代码造成了错误)
-----指示异常的类型以及导致引发异常的错误的简要描述
举例:
def read_number():
num = int("eleven")#这会引起一个异常,因为eleven是一个字符串,不能用整数int
read_number()
就会得到以下错误:
Traceback (most recent call last):
File "C:\......\Lecture_5.py", line 3, in <module>
read_number()
File "C:\......\Lecture_5.py", line 2, in read_number
num = int("eleven")
ValueError: invalid literal for int() with base 10: 'eleven'
避免异常
通过仔细编码可以防止许多异常。
----示例:输入验证(当我们有输入时,在输入系统之前,可以检查输入是否符合我们的要求)
通常需要一个简单的决策结构:(举例)
if N > 0:
math.sqrt(N)
如果传递的值为0或者更低,就会给出一个错误。
通过这样事先写一个if语句可以确保我们的N是一个理想的值。
一些异常无法通过仔细的编码来避免。
-----比如试图将非数字字符串转换为整数,
-----试图打开一个读取不存在的文件。
异常处理
异常处理程序:在引发异常并防止程序崩溃时响应的代码。
在Python中,使用try/except语法来捕捉错误。
格式:
try:
statements
except exceptionName:
statements
尝试套件:可能引发异常的语句
处理程序或例外部分:except块中包含的语句
举例:
有一个函数,它把num1除以num2
但是不能把12除以0,任何数字都不能除以零。
我们知道用户可以输入0
我们可以编写另一个类似的函数:
取两个数字把它们相除,不一样的是:
不是仅仅像之前分开,而是用try语句把数字相除,
如果得到零语法错误 (ZeroDivisionError是确切的错误名称),就会打印异常。因此,这样操作后,代码的结果会是一个恰当的结果。
处理多个异常
尝试套件中的代码通常可以引发不止一种类型的异常。需要为每种需要处理的异常类型编写except子句。所以正确的做法是尽量具体化。
有一个除数函数,从输入中取两个数,然后打印数字除以数字的结果。
假设我们输入的数字是这样的:
我们就会有ValueError
如果是这样的,就会有一个零除法错误。
为了避免这样的错误发生,可以写一个try/except语句:
捕捉值错误的同时也能捕获零除法错误。一旦捕捉到,就会实行打印对应的语句。
不列出特定异常的except子句将处理try套件中引发的任何异常。当我们不确定有多少异常时,但是想全部捕获,可以直接靠except:
这样就能捕捉到python可能给我们带来的每一个错误。
显示异常的默认错误消息
异常对象:抛出异常时在内存中创建的对象。
–—通常此对象包含与异常相关的默认错误消息
–—可以将异常对象分配给except子句中的变量(except子句使我们能够进入并捕获这个异常对象以获取更多信息)
–—可以将异常对象变量传递给print函数以显示默认错误消息。
def main():
total = 0
try:(有一个try语句试图做一些事情)
infile = open('sales_data.txt', 'r') (打开一个文件,读取文件的第一行)
string = infile.readline()
except FileNotFoundError as exp:(运行except语句)
print(exp)
该对象已存储在内存中,而且能够显示出错误。
else子句
try/except语句可能包含可选的else子句,该子句出现在所有except子句之后。
----else子句与try 和 except子句对齐
----语法类似于决策结构中的else子句
----Else套件:仅在未引发异常的情况下,在try套件中的语句之后执行的语句块。如果引发异常,则跳过else套件
。
格式:
try:
statements
except exceptionName:
statements
else:(只有在try成功的情况下才会运行。如果try不成功并且抛出错误,将只运行except子句。)
statements
举例:
如果传递12和0,实际上会导致ZeroDivisionError错误,就会打印except中对应的语句和异常的对象。
下面的例子中就是try中没有造成任何错误:
就会跳下去运行else
finally子句
try/except语句可以包含可选的finally子句,它出现在所有except子句之后。
----与try 和 except子句对齐
----Finally套件:Finally子句后的语句块
----无论是否发生异常,finally套件都会被执行
----目的是在退出之前执行清理。
所以可以用finally子句在退出except之前运行一些清理代码。