异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
常见的异常如下:
1.
# print(a)
# NameError
2.
# print(10/0)
# ZeroDivisionError (除0错误)
3.
# 索引异常: IndexError
# str = 'hello'
# print(str[6])
4.
# 字典key值错误: KeyError
# d = dict(a=1, b=2)
# 如果key值不存在, 返回None;
# print(d.get('c'))
# print(d.get('c', "key不存在"))
# # print(d['c'])
5.
# 缩进异常: IndentationError
# age = 18
# if age > 18:
# print('adult')
# else:
# print("not adult")
# print('dhchfdhvf')
1.异常处理
通常使用try...except... 语句进行异常处理,结构如下:
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
例如:
try:
# try里面写的是要执行的代码;
print(a)
print(10/0)
# 此处不会打印westos, 因为上一行代码执行报错;
print('westos')
except NameError:
# try里面的代码如果有异常/错误, 才会执行的代码;
# except NameError:, 只对NmaeError错误进行处理;
print("错误")
else:
# 判断是否有异常, 如果没有, 执行此代码;
print("运行成功")
finally:
# 有异常和没有异常都会执行的代码;
print("检测finally的作用")
import sys
try:
10/0
f = open('passwd')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
# sys.exc_info(): 获取异常信息
print(sys.exc_info())
print("Unexpected error:", sys.exc_info()[0])
# 抛出异常, 本来可以正确执行的代码让报错;
raise
这里用到一个raise 它可以抛出异常,使处理了的异常报出错误,下面会在触发异常中详细介绍。
异常处理的一些其它用途: 除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中 一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的 模块将引发一个 ImportError 异常。 你可以使用这种方法来定义多级别的功能――依靠在运行时哪个模块是有效的,或支持多 种平台 (即平台特定代码被分离到不同的模块中)。
2.触发异常
使用raise语句自己触发异常, raise语法格式如下:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种, args 是自已提供的异常参数。
例子如下:
# 录入学生信息的系统;
# 对录入的信息进行校验: 1). len(姓名)>2 2). 0<age<150
name = input("姓名:")
if len(name) < 2:
raise NameError("姓名必须大于2位")
age = int(input("年龄:"))
if age < 0 or age >= 150:
raise NameError("年龄必须在0<age<150")
所有的异常类总结:
下面有一个用户中断执行的案例,实现对从开始输入的数字到终止时之间输入的数字求和:
# 用户可以一直输入数字, 当按ctrl+c之后计算所有数的和;
result = 0
while True:
try:
num = int(input('Num:'))
# result = result + num
result += num
# 用户中断运行的异常; ===捕获异常
except KeyboardInterrupt:
print("运行结果:", result)
break
结果如下: