错误和异常处理的大纲:
错误和异常概念
常见错误
异常处理(try_except使用及else使用,截获异常,try_finaly使用,异常处理综合使用)
with...as语句与上下文管理
标准异常和自定义异常
raise和assert语句
错误和异常的概念:
错误:
1,语法错误:代码不符合解释器或编译器语法
2,逻辑错误:不完整或不合法输入或计算出现问题(比如传参时候参数不合理,
或者除零操作)
异常:执行过程中出现问题导致程序无法执行
1,程序遇到逻辑或者算法问题
2,运行过程中计算机错误(内存不够或者IO错误,例:因磁盘损坏导致访问文件失败)
错误和异常区别
错误:
代码运行前的语法或者逻辑错误
语法错误在执行前修改,逻辑错误无法修改
异常分为两个步骤:
1,异常产生,检查到错误且解释器认为是异常,抛出异常
2,异常处理,截获异常,忽略或者终止程序处理异常
常见错误:
1,a:NameError 未定义就使用变量
2,if True :SyntaxError 语法错误
3,f=open('1.txt'):IOErroe 打开不存在文件时的错误
4,10/0 :ZeroDivisionError 除数为零的错误
5,a=int('dd') :ValueError 进行类型转换的时候发生的错误
6,键盘中断错误
try-except:异常处理
try:
try_suit #想要处理的代码块
except Exception [e]: # Except设置异常的类,[e]变量保存出现异常的类型
exception_block #处理捕获的异常
1,try用来捕获try_suite中的错误,并将错误交给except处理
2,except用来处理异常,如果处理异常和设置捕获异常一致,使用exception_block处理异常,
否则交给Python解释器或系统处理异常,变量[e]用来保存错误信息
小栗子:
try:
a
except NameError as err: #将异常信息转存到变量err中
print("catch Error:",err)
print("error is print ")
try-except捕获异常分析:
代码块1
try:
undef
except :
print"catch an except"
代码块2
try:
if undef
except :
print"catch an except"
代码块1:可以捕获异常,因为是运行时错误
代码块2,不能捕获异常,以为是语法错误,运行前错误
代码块2是在编译成二进制文件时因语法错误而无法生成二进制文件,代码并未执行
代码块3:
try:
undef
except NameError as e :
print("catch an except",e)
代码块4:
try:
undef
except IOError as e :
print("catch an except",e)
代码块3:可以捕获异常,因为设置捕获NameError异常
代码块4:不可以捕获异常,因为设置IOError,不会处理NameError,会交给Python处理异常,Python解释器的处理方式就是终止程序运行
try-except用例:
需求:猜数字游戏
1,开始游戏产生一个1~100随机数
2,用户输入,游戏根据输入值提示大或者小
3,用户根据提示继续输入,直到猜中位置
4,如果用户输入错误,程序可以处理异常
import random
num=random.randint(0,100)
while True:
try:
guess=int(input("Enter 1~100"))
except ValueError as e:
print("Enter 1~100")
if guess > num:
print("guess Bigger:",guess)
elif guess < num:
print("guess Smaller:",guess)
else:
print("Guess OK")
break
print("\n")
try-except捕获多个异常
import sys
try:
f = open('myfile.txt')
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:
print("Unexpected error:", sys.exc_info()[0])
raise
上面是Python官方教程中的捕获多个异常的示例。
使用多个except可以处理多个异常类
try-except--else使用:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
上面是python官方教程示例。
如果没有异常,执行else语句中的代码
语法格式:
try:
try_suite
finally:
do_finally
1,如果try语句没有捕获错误,代码执行do_finally语句
2,如果try语句捕获错误,程序首先执行do_finally语句,然后将捕获到的错误交给python解释器处理
try-finally语句不是用来处理异常的,而是用来做清理工作的。
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
规则:try-finally无论是否检测到异常,都会执行finally代码
作用:为异常处理事件提供清理机制,用来关闭文件或者释放系统资源。
try-except-finally使用:
try:
try_suite
except:
do_except
finally:
do_finally
1,若try语句没有捕获异常,执行完try代码段后,直接执行finally语句
2,若try捕获异常,首先执行except处理错误,然后执行finally语句
try-except-else-finally使用:
try:
try_suite
except:
do_except
else:
do_else
finally:
do_finally
1,若try没有捕获异常,执行完try代码块后,执行else代码段,最后执行finally
2,若try捕获异常,首先执行except处理错误,然后执行finally
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "", line 1, in
File "", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
以上是python官方教程示例
语法格式:
with context [as var]:
with_suite
1,with语句用来代替try-except_finally语句,使代码更简洁
2,context表达式返回是一个对象
3,var用来保存context返回对象,单个返回值或元组
4,with_suite就是使用var变量来对context返回对象进行操作
with语句实例:
with open('1.txt') as f:
for line in f.readlines()
print(line)
1,打开1.txt文件
2,f变量接收文件对象返回的对象
3,with中的代码块执行完成后关闭文件
with语句实质是上下文管理:
1,上下文管理协议:包含方法__enter__()和__exit__(),支持该协议的对象要事先这两个方法
2,上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作
3,进入上下文管理器:调用管理器__enter__方法,如果设置as var 语句,var变量接收__enter__()方法返回值
4,退出上下文管理器:(代码执行完成,或出现异常)调用管理器__exit__方法,对资源进行清理,对文件进行关闭
with语句应用场景:
1,文件操作
2,进程线程之间互斥对象,例如互斥锁
3,支持上下文的其他对象
raise语句:
raise语句用于主动抛出异常(使代码终止运行)
语法格式:raise [exception[,args]]
exception:异常类
args:描述异常信息的元组
raise exception (arg) #python3
assert语句:
断言语句:assert语句用于检测表达式是否为真,如果为假,引发AssertionError错误
语法格式:assert exception [,args]
exception:表达式
args:判断条件的描述信息
assert exception (args)
应用:对传入的参数进行判断
理解不透彻,后续会更新