python学习笔记(十六)异常
1、异常初见
异常是python中的一种特殊对象,之前了解过的文件对象也一样,但是异常对象被使用来管理程序执行期间发生的错误。每当出现一个超出python处理范围的错误,它都会自动创建一个异常对象。
如果我们在编写程序的时候提前考虑到了异常,就可以使用 try-except 代码块把它处理掉,否则程序就会异常停止,并且出现一个traceback,返回给用户有关异常的报告,尽管这可以帮助我们调试程序,但实际上它也是一把双刃剑。
一方面,异常导致的程序崩溃很可能会造成一些意想不到的错误,比方说数据受损;另一方面,一个优秀的程序应该避免让使用它的用户看到返回的traceback,因为异常报告往往会泄露一些很重要的信息(文件名,部分代码等),有些别有用心的用户很可能会借此攻击我们的代码。
2、具体了解异常
这里附上一些常见的异常,如果大家在学习过程中遇到一些其他的异常,可以自行查阅资料,根据异常报告调试代码。
1、ZeroDivisionError:除0异常
2、FileNotFoundError:访问不存在的文件
3、SystaxError:语法错误
4、IndexError:访问序列中不存在的索引
5、NameError:访问未声明变量
6、KeyError:访问字典中不存在的键
7、AttributeError:访问不存在的对象属性
本文主要以除0异常为例来了解异常。
我们先来了解一下traceback:
print(1/0)
这一行代码会导致程序异常停止,并返回如下traceback:
Traceback (most recent call last):
File "/(前面的文件路径涉及个人隐私就不放出来了,大家可以根据自己的测试结果理解)/python_work/day_16/division.py", line 1, in <module>
print(1/0)
ZeroDivisionError: division by zero
在上述traceback中,最后一行指出生成了一个ZeroDivisionError异常对象,并且是由除以0产生的。同时异常报告还会告诉我们程序是因为哪个代码文件中的哪一行指令停止运行的,这可以帮助代码编写者调试程序。
下面我们来学习如何处理异常。
try:
print(1/0)
except ZeroDivisionError:
print("Forbid divide by zero!")
运行结果为:
Forbid divide by zero!
当我们认为代码可能会导致程序发生异常时,可以使用一个 try-except代码块来进行处理。比如在上面的例子中:
我们将可能会导致程序异常终止的代码放在try代码块中,它让程序先尝试运行,如果没有产生异常,那么python将跳过下面的except代码块,继续运行try-except代码块后面的代码;但是如果try代码块产生了异常,python将寻找指出异常类型的except代码块,并运行其中的代码,之后继续运行try-except代码块后面的代码。
异常处理的核心就在于提前处理好可能出现错误的代码块,让用户在使用程序时,万一进行不当操作,会收到一条指出错误的信息而非traceback。
3、try-except-else代码块
try-except-else代码块的工作机理:
try代码块:运行可能会引发异常的代码
except代码块:try代码块的代码如果引发异常,python根据引发的异常查找指出相应异常的except代码块,执行其中的处理操作
else代码块:仅在try代码块中的代码未引发异常时才需要运行的代码
下面我们来看一段成功处理异常的代码:
print("Please input two numbers, I'll divide them for you.")
print("Please input 'e' to end.")
while True:
number_0 = input("\nThe first one: ")
if number_0 == 'e':
break
number_1 = input("\nThe last one: ")
try:
ans = int(number_0) / int(number_1) # 输入的是字符串,所以先得用int()函数进行转换
except:
print("Forbid divide by zero!")
else:
print(ans)
运行结果为:
Please input two numbers, I'll divide them for you.
Please input 'e' to end.
The first one: 2
The last one: 1
2.0
The first one: 1
The last one: 2
0.5
The first one: 1
The last one: 0
Forbid divide by zero!
The first one: e
4、pass
python中有一个pass语句,它的功能就是告诉程序什么都不要做,有时候,我们可以借助它在代码引发异常时“保持沉默”。
print("Please input two numbers, I'll divide them for you.")
print("Please input 'e' to end.")
while True:
number_0 = input("\nThe first one: ")
if number_0 == 'e':
break
number_1 = input("\nThe last one: ")
try:
ans = int(number_0) / int(number_1) # 输入的是字符串,所以先得用int()函数进行转换
except:
pass
else:
print(ans)
运行结果为:
Please input two numbers, I'll divide them for you.
Please input 'e' to end.
The first one: 1
The last one: 2
0.5
The first one: 2
The last one: 1
2.0
The first one: 1
The last one: 0
The first one: e
熟练掌握异常,可以令在使用程序时由于误操作引发异常的用户,看到我们希望他们看到的内容。