概念
错误:
1:语法错误:代码不符合解释器或者编译器语法
2:逻辑错误:不完整或者不合法输入或者计算出现问题
编译器或者解释器可以检查出语法错误,但检查不出逻辑错误。
常见错误
SyntaxError 语法错误
NameError 变量未定义
IOError IO错误(读写文件)
ZeroDivsionError 10/0 0除错误
ValueError 强制类型转换错误 a = int(‘dd’)
KeyboardInterrupt ctrl+c强制退出正在运行的程序时报
异常:
程序执行过程中出现问题导致无法继续进行
1:程序遇到逻辑或者算法问题
2:运行过程中计算机错误(内存不够或者IO错误)
异常的两个步骤
1:异常产生,检查到错误且解释器认为是异常,抛出异常
2:异常处理,截获异常,忽略或终止程序处理异常
try-except 异常处理
try:
try_suite
except Exception1 as e:
exception_block
except Exception2 as e:
exception_block
...
1:try用来捕获try_suite宏的错误,并将错误交给except处理
2:except用来处理异常,如果发生的异常和设置捕获的异常一直,则使用exception_block处理异常
3:使用多个except可以处理多个异常类
3:如果except后面不跟具体内容,则捕获所有运行时产生的异常
4:捕捉到异常之后,代码可以继续运行,否则代码会中止运行
try:
a
except NameError as e:
print("catch Error:", e)
print("exec over")
try-except–else
如果没有异常,执行else语句中的代码
try:
try_suite
except Exception1 as e:
exception_block
else:
none_exception
try-finally
try:
try_suite
finally:
do finally
1:如果try语句没有捕获错误,代码执行do_finally语句
2:如果try语句捕获错误,程序首先执行do_finally语句,然后将捕获到的错误交给python解释器处理
无论是否检测到异常,都会执行finally代码,
finally语句主要用于做一些清理工作,用来关闭文件或者释放系统资源
try-except-finally
try:
try_suite
except Exception as e:
exception_block
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_suite后,执行do_else,最后执行do_finally
2:若try捕获异常,首先执行do_except处理异常,然后执行finally
with语句
with context [as var]:
with_suite
1:with语句用来代替try-except_finally语句,使代码更简洁;
2:context表达式返回一个对象;
3:var用来保存context返回对象,单个返回值或者元组
4:with_suite使用var变量来对context返回对象进行操作
with本身不能处理异常,可以包裹在try-except中,但省略了finally
with 语句实质是上下文管理:
1:上下文管理协议:包含方法_enter_()和_exit_(),支持该协议的对象要实现这两个方法
2:上下文管理器:定义执行with语句时要建立的运行 时上下文,负责执行with语句块上下文中的进入与退出操作
3:进入上下文管理器:调用管理器_enter_()方法,如果设置as var语句,var变量接收_enter_()方法返回值
4:退出上下文管理器:调用管理器_exit_()方法
class Mycontext(object):
def __init__(self, name):
self.name = name
def __enter__(self):
print("__enter__")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("__exit__")
print("Error:", exc_type, "info:", exc_value)
def do_self(self):
print("do_self")
if __name__ == '__main__':
with Mycontext('test context') as f:
print(f.name)
f.do_self()
with语句应用场景:
1:文件操作;
2:进程线程之间互斥对象,如互斥锁;
3:支持上下文管理的其他对象
raise语句
raise语句用于主动抛出异常
语法格式:raise[exception(,args)
exception:异常类
args:描述异常信息的元组
assert语句
断言语句:assert语句用于检测表达式是否为真,如果为假,引发AssertionError错误
语法格式:assert expression [,args]
expression:表达式
args:判断条件的描述信息
注:产生的AssertionError可以交给系统解释器处理,也可以主动处理
标准异常
python内建异常,程序执行前就已经存在
BaseException:
https://docs.python.org/3/library/exceptions.html?highlight=baseexception
KeyboardInterrupt 用户中端(ctrl+c)
Exception 常见错误的基类:
SyntaxError, NameError, IOError, ImportError…
SystemExit Python解释器退出
自定义异常
1:python允许自定义异常,用于描述python中没有涉及的异常情况;
2:自定义异常必须继承Exception类
3:自定义异常只能主动触发
class FileError(IOError):
pass
try:
raise FileError('test')
except FileError as e:
print(e)
class CustomError(Exception):
def __init__(self, info):
Exception.__init__(self, info)
self.errorinfo = info
print(id(self))
def __str__(self):
return "CustionError:%s" % self.errorinfo
try:
raise CustomError('mine ')
except CustomError as e:
print('ErrorInfo:%d, %s' % (id(e), e))
抛出的异常与产生的对象是同一个