13)错误和异常
AttributeError:属性错误,特性引用和赋值失败时会引发属性错误(访问未知对象属性)
NameError:试图访问的变量名不存在
SyntaxError:语法错误,代码形式错误
Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions python 模块中定义。
IOError:python ioerror,一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误
KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误(字典关键字不存在)
IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引、python list index
TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。
AssertionError:断言错误
LookupError:键、值不存在引发的异常,LookupError异常是IndexError、KeyError的基类, 如果你不确定数据类型是字典还是列表时,可以用LookupError捕获此异常。
StandardError: 标准异常,错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束。
https://www.iplaypy.com/jinjie/jj158.html
2. 错误处理
try-except-else-finally语句
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
except (RuntimeError, TypeError, NameError):
pass
例子:
try:
x = int(input("请输入一个数字: "))
except NameError as nam:
print("Wrong!", nam)
except ValueError as val:
print(("请输入数字!"), val)
else:
try:
y = int(input("在输入一个数字:"))
except ValueError as vals:
print(("请输入数字!"), vals)
else:
print('输出:',x + y)
finally:
print('反正会输出的,管他那么多')
注1:如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中,如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如上所示的消息。
# err.py:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
##执行,结果如下:
$ python3 err.py
Traceback (most recent call last):
File "err.py", line 11, in <module> #错误位置
main()
File "err.py", line 9, in main #错误位置
bar('0')
File "err.py", line 6, in bar #错误位置
return foo(s) * 2
File "err.py", line 3, in foo #错误位置
return 10 / int(s)
ZeroDivisionError: division by zero
注2: 如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
3. 记录错误
如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
Python内置的logging
模块可以非常容易地记录错误信息:
# err_logging.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
同样是出错,但程序打印完错误信息后会继续执行,并正常退出:
$ python3 err_logging.py
ERROR:root:division by zero
Traceback (most recent call last):
File "err_logging.py", line 13, in main
bar('0')
File "err_logging.py", line 9, in bar
return foo(s) * 2
File "err_logging.py", line 6, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
END
4. 抛出错误
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:
raise [Exception [, args [, traceback]]]
5. 用户定义异常
6. 断言
凡是用print()来辅助查看的地方,都可以用断言(assert)来替代
语法格式
assert expression [, arguments] ##[]表示可选参数 可以是字符串
例如:
>>> assert True # 条件为 true 正常执行 >>> assert False # 条件为 false 触发异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError >>> assert 1==1 # 条件为 true 正常执行 >>> assert 1==2 # 条件为 false 触发异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError >>> assert 1==2, '1 不等于 2' Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError: 1 不等于 2
注: 启动Python解释器时可以用-O
参数来关闭assert
:,断言的开关“-O”是英文大写字母O,不是数字0。