异常处理
在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错误,甚至逻辑错误。还有一些错误,则是不可预料的错误,但是完全有可能发生的,比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。大多数的异常都不会被程序处理,而是以错误信息的形式展现出来。
异常有很多种类型,Python内置了几十种常见的异常,就在builtins模块内,无需特别导入,直接就可使用。需要注意的是,所有的异常都是异常类,首字母是大写的!
10 * (1/0)
Traceback (most recent call last):
File “”, line 1, in ?
ZeroDivisionError: division by zero
4 + spam*3
Traceback (most recent call last):
File “”, line 1, in ?
NameError: name ‘spam’ is not defined
‘2’ + 2
Traceback (most recent call last):
File “”, line 1, in ?
TypeError: Can’t convert ‘int’ object to str implicitly
为了保证程序的正常运行,提高程序健壮性和可用性。我们应当尽量考虑全面,将可能出现的异常进行处理,而不是留在那里,任由其发生。
Python内置了一套try…except…finally(else)…的异常处理机制,来帮助我们进行异常处理。其基本语法是:
try:
pass
except Exception as ex:
pass
try…except…语句处理异常的工作机制如下:
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except ZeroDivisionError as e:
print(e)
结果:
发生异常之前的语句正常执行
division by zero
如果程序发生的异常不在你的捕获列表中,那么依然会抛出别的异常。
未捕获到异常,程序直接报错
s1 = ‘hello’
try:
int(s1)
except IndexError as ex: # 本例为非法值异常,而你只捕获索引异常
print(ex)
Traceback (most recent call last):
File “F:/Python/pycharm/201705/1.py”, line 5, in
int(s1)
ValueError: invalid literal for int() with base 10: ‘hello’
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
try:
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except ValueError as e:
print(e)
except ZeroDivisionError as e:
print(“里层没有抓好,只能辛苦我外层了”)
文件读写异常处理
import time
try:
f = open(‘test.txt’)
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
pass
finally:
f.close()
print('关闭文件')
except Exception:
print(‘没有这个文件’)
可能包含多个except子句,分别来处理不同的特定的异常
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except NameError as e:
print(e)
except ZeroDivisionError as e:
print(“我是第一个抓取到除零异常的”)
发生异常之前的语句正常执行
我是第一个抓取到除零异常的
捕获多个异常
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
open(“xxx.txt”)
print(“发生异常之后的语句不会被执行”)
except (ZeroDivisionError,FileNotFoundError) as e:
print(e)
通用异常:Exception
在Python的异常中,有一个通用异常:Exception,它可以捕获任意异常。
s1 = ‘hello’
try:
int(s1)
except Exception as e:
print(‘错误’)
finally:
print(“finally被执行”)
主动抛出异常:raise
很多时候,我们需要主动抛出一个异常。Python内置了一个关键字raise,可以主动触发异常。
raise
Traceback (most recent call last):
File “<pyshell#0>”, line 1, in
raise
RuntimeError: No active exception to reraise
raise NameError(“kkk”)
Traceback (most recent call last):
File “<pyshell#1>”, line 1, in
raise NameError(“kkk”)
NameError: kkk
自定义异常类抛出
class ShortInputException(Exception):
def init(self,info):
self.info = info
def main():
try:
s = “ab”
if len(s) < 3:
raise ShortInputException(“长度不够”)
except ShortInputException as e:
print(e)
main()
自定义异常
Python内置了很多的异常类,并且这些类都是从BaseException类派生的。