程序中难免出现错误,错误分为两种:
语法错误,这种错误无法避免,必须在程序执行前就要改正
逻辑错误
python中异常种类:
python中不同的异常可以使用不同的类型,常用异常如下:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常处理:
01.什么是异常处理?
python解释器检测到错误,触发异常(同时也允许程序员自己触发异常),可以编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功就进入另外一个处理分支,执行定制的逻辑,使程序不会崩溃,这就是异常处理
02.为什么要进行异常处理?
python解析器执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,所以必须提供一种异常处理机制来增强你程序的健壮性与容错性.
03.如何进行异常处理?
基本语法:
try:
被检测的代码
except 异常类型:
try检测到异常,就会执行这个位置的逻辑
04.分类:
(1)try单支:
try:
lst = [1,2,3,4,5,6]
lst[10]
except IndexError: 超范围异常,会跳过异常,直接执行print(666)
print(666)
(2)try多支:
try:
lst = [1,2,3,4,5,6]
lst[10]
dic = {}
print(dic[‘key‘])
except KeyError as e: 如果dic={},print(dic[‘key‘])在lst[10]上面,就先执行KeyError错误
print(e)
except IndexError:
print(123) 超出范围,执行print(123)
(3)万能异常:
try:
lst = [1,2,3]
lst[6]
except Exception:
print(666)
print(111) 不显示错误信息,跳过异常,往下执行
(4)try多分支 + 万能异常:
def login():
print(‘欢迎进入登录界面‘)
def register():
print(‘欢迎进入注册界面‘)
dic = {1:login,2:register}
while True:
print(‘‘‘
1.登录
2.注册
‘‘‘)
try:
num = int(input(‘请输入选项>>>‘))
dic[num]()
except ValueError:
print(‘请输入数字>>>‘)
except KeyError:
print(‘请输入正确序号>>>‘)
(5)try except else:
try: 出现异常就执行else,否则就不执行
a
print(111)
except Exception:
print(222)
else:
print(333)
print(666) 结果:222,666
(6)try except finally: 不管是否出现异常都会执行,在异常出现之前会执行finally,通常是清理工作
s1 = ‘hello‘
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
else:
print(‘try内代码块没有异常则执行我‘)
finally:
print(‘无论异常与否,都会执行该模块,通常是进行清理工作‘)
用途1: 关闭文件句柄,关闭数据库链接
try:
f = open(‘user_id‘,mode=‘w‘,encoding=‘utf-8‘)
f.write(‘...‘) 文件句柄操作的内容非常多
except Exception:
print(123)
finally:
print(333)
用途2: 函数执行return之前能执行finally代码
def func():
try:
return 666
finally:
print(333)
print(func()) 结果为:333,666,在return之前执行finally
用途3: 循环中break之前可执行finally代码
while True:
try:
if 2 > 1:
break
finally:
print(333) 在break执行之前,执行finally
(7)raise主动抛出异常:
try:
raise TypeError(‘类型错误‘)
except Exception as e:
print(e)
(8)断言assert:
class A:
name = None
def get(self):
assert A.name is not None: assert 1==1
num = 123
for i in range(10):
num += 1
print(num)
obj = A()
# A.name = ‘Barry‘
obj.get() 结果为:133
(9)自定义异常:
当遇到一些大的项目,出现的错误是python解释器没有定义的数据类型,可以自定义一个异常处理的类,继承BaseException.
class PhoneConnection(BaseException):
pass
try:
raise PhoneConnection(‘手机连接错误‘)
except Exception as e:
print(e)
小结:
异常处理不能经常使用,耗费性能;异常处理的分支越多,代码越冗余,可读性越差,所以能用程序解决的问题,尽量用程序解决
使用 try...except 的方式:
01.把异常处理和真正的工作区分开来
02.代码更容易组织,更清晰,复杂的工作任务更容易实现
03.使程序更加安全,不会因为一些小的疏漏而使程序意外崩溃
原文:https://www.cnblogs.com/py8318/p/10409447.html