异常就是程序运行的时候出现了报错(在程序出现错误的时候,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序运行会终止)
出错类型
1.语法错误(书写错误)
如下面的出错
2.其他类型的出错
# TypeError
for i in 3:
pass
TypeError: 'int' object is not iterable
类型错误::int类型不可迭代
----------------------------------------------
# ValueError
inp=input(">>: ") # 输入 qf
int(inp)
ValueError: invalid literal for int() with base 10: 'qf'
值错误:int不能把字符串转换成整型
-----------------------------------------------
# NameError
aaa
NameError: name 'aaa' is not defined
名字错误:名字‘aaa’没有定义
----------------------------------------------
# IndexError
l=['yangge','aa']
l[3]
IndexError: list index out of range
索引错误:数列的索引超出了范围
-----------------------------------------------
# KeyError
dic={'name':'yangge'}
dic['age']
KeyError: 'age'
键错误:没有这个键
-----------------------------------------------
# AttributeError
class Foo:
pass
Foo.x
AttributeError: type object 'Foo' has no attribute 'x'
属性错误:类型对象‘Foo’没有属性‘x’
-----------------------------------------------
# ZeroDivisionError:无法完成计算
res1=1/0
异常的种类
试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
AttributeError
输入/输出异常;基本上是无法打开文件
IOError
无法导入模块或包;基本上是路径问题或名称错误
ImportError
语法错误(的子类) ;代码没有正确对齐
IndentationError
下标索引超出序列边界,比如当 li 只有三个元素,却试图访问 li[5]
IndexError
试图访问字典里不存在的键
KeyError
按了一下 Ctrl+C
KeyboardInterrupt
(键盘中断)使用一个还未被赋予对象的变量
NameError
无效语法,语法错误
SyntaxError
传入对象类型不符合要求,如sum 函数需要的是 int,但你传入了 str
TypeError
试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
UnboundLocalError
例如:
"""
x = 1
def func():
x += 1
return xfunc()
UnboundLocalError: local variable 'x' referenced before assignment
局部变量 x 在赋值之前被引用
"""
- 传入一个调用者不期望的值,即使值的类型是正确的,比如 int('a')
ValueError
异常处理
为了保证程序的健壮和容错性,即在遇到错误的程序时不会中断
1.处理方法
使用try:,,,,,except:,,,,,:可以在发生错误之后进行处理。
try:
被检测到的代码模块
except 异常类型:
try中一旦检测到的异常,就执行职工位置的逻辑
-------------------------------
例子:
def func(arg):
try:
arg +=1
except TypeError as e:
#如果检测到类型错误就把这个类型错误命名为e;
#并输出这个错误的报错
print(e)
func('ad') #很明显这是不能用字符串的
2.异常的处理进阶
2.1处理单种错误
def func(arg):
try:
arg +=1
except TypeError as e:
#如果检测到类型错误就把这个类型错误命名为e;
#并输出这个错误的报错
print(e)
func('ad')
2.2处理多种异常
try:
.....
except IndexError as a:
print(a)
except KeyError as a:
print(a)
except ValueError as a:
print(a)
#写多种异常的判断
2.3处理全部异常
Exception 可以匹配全部的错误
x="kja"
try:
int(x)
except Exception as e:
print(e)
2.4其他的异常处理结构
x = 'akldk'
try:
int(x)
except Exception as e:
print(e)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论异常与否,都会执行该模块,通常是进行清理工作'如关闭文件、关闭ssh连接、删除日志等)
异常处理(常用)
import traceback
#这个模块可以用来捕获并打印的所有的异常信息(包括哪里犯了这个错误)
#注意上面的没有使用这个模块的只会打印出是犯了哪种错误
#而不不知道在哪个文件哪个函数哪一行出错了
print('start-->')
try:
1 + 'a'
except TypeError as e:
print(e)
print('*' * 30)
print(traceback.format_exc()) #这个可以用来接受全部的报错
print('*' * 20)
print('end')
traceback.print_exc()跟traceback.format_exc()有什么区别呢?
format_exc()返回字符串,print_exc()则直接给打印出来。
即traceback.print_exc()与print traceback.format_exc()效果是一样的。
print_exc()还可以接受file参数直接写入到一个文件。比如
traceback.print_exc(file=open('tb.txt','w+'))
写入到tb.txt文件去。