概述
异常处理
什么是异常
异常是发生错误的信号,一旦程序出现错误,并且程序没有处理这种错误,那就会抛出异常,并且程序终止
错误分类
- 语法错误
- 逻辑错误
语法错误
- SyntaxError
语法错误就是不符合python基本的语法要求的,这种错误会直接导致程序无法运行,所以必须在程序运行前进行改正
>>> print"haha"
SyntaxError: invalid syntax
>>> if True
SyntaxError: invalid syntax
逻辑错误
常见的逻辑错误
- TypeError
>>> for i in 6:
pass
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
for i in 6:
TypeError: 'int' object is not iterable
- KeyError
>>> k = {"Age":18,"Name":"YOHO"}
>>> k["school"]
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
k["school"]
KeyError: 'school'
- NameError
>>> name
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
name
NameError: name 'name' is not defined
- IndexError
>>> l = [i for i in range(10)]
>>> l[11]
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
l[11]
IndexError: list index out of range
错误类型 | 错误说明 |
---|---|
AssertionError | 断言语句(assert)失败 |
AttributeError | 尝试访问未知的对象属性 |
EOFError | 用户输入文件末尾标志EOF(Ctrl+d) |
FloatingPointError | 浮点计算错误 |
GeneratorExit generator.close() | 方法被调用的时候 |
ImportError | 导入模块失败的时候 |
IndexError | 索引超出序列的范围 |
KeyError | 字典中查找一个不存在的关键字 |
KeyboardInterrupt | 用户输入中断键(Ctrl+c) |
MemoryError | 内存溢出(可通过删除对象释放内存) |
NameError | 尝试访问一个不存在的变量 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统产生的异常(例如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 |
RuntimeError | 一般的运行时错误 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python的语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混合使用 |
SystemError | Python编译器系统错误 |
SystemExit | Python编译器进程被关闭 |
TypeError | 不同类型间的无效操作 |
UnboundLocalError | 访问一个未初始化的本地变量(NameError的子类) |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
UnicodeTranslateError | Unicode转换时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除数为零 |
异常处理原则
- 对于可预知的错误,应该用if判断来进行预防
age = input("请输入年龄:").strip() # 用户可能输入非数字的字符串
if age.isdigital(): # 通过增加判断,当为数字字符串时,才进行整数转换,来避免报错
age = int(age)
print(age)
- 对于不可预知的错误,则用python的异常处理机制try,except.
try: #文件的内容不可预知,故无法用if来规避,则只能使用try
f = open("a.txt","r",encoding="utf-8")
next(f)
next(f)
next(f)
next(f)
except StopIteration:
print("出错啦")
try,except 详细用法
- 异常类只能处理指定的异常情况
略, 见下
- 多分支
被监测的代码块,抛出的异常有多种可能性,并且需要我们针对每一种异常都定制专门的处理逻辑
try:
l = [1,3,4]
l[5]
name
d = {}
d["a"]
except IndexError as e: # 这里as 后边的变量可以打印系统提示的错误原因
print("出错原因:",e)
except NameError as e:
print("出错原因:",e)
except KeyError as e:
print("出错原因:",e)
print("异常处理后的代码。。。")
- 万能异常
被监测的代码块,抛出的异常有多种可能性,但我们只需要对异常统一按照一种处理逻辑进行处理,这时用万能异常Exception
try:
l = [1,3,4]
l[5]
name
d = {}
d["a"]
except Exception as e:
print("出错原因:",e)
print("异常处理后的代码。。。")
多分支和万能可以组合使用,类似elif,else组合
try:
l = [1,3,4]
l[5]
name
d = {}
d["a"]
except IndexError as e:
print("出错原因:",e)
except NameError as e:
print("出错原因:",e)
except KeyError as e:
print("出错原因:",e)
except Exception as e:
print("出错原因:",e)
print("异常处理后的代码。。。")
- 其他用法
else
try:
l = [1,3,4]
l[5]
name
d = {}
d["a"]
except IndexError as e:
print("出错原因:",e)
except NameError as e:
print("出错原因:",e)
except KeyError as e:
print("出错原因:",e)
except Exception as e:
print("其他错误原因:",e)
else:
print("当代码段没有异常时,执行此段代码")
finally:
print("不管代码段有没有异常,都会被执行")
print("异常处理后的代码。。。")
- 主动触发异常
raise 异常类型(值)
class People():
def __init__(self,name,age)
if not isinstance(name,str):
raise TypeError("名字必须传入str类型")
if not isinstance(age,int)
raise TypeError("年龄必须传入int类型")
self.name = name
self.age = age
- 自定义异常
class Myexception(BaseException) #继承python自带的异常类型
def __init__(self,msg):
super(Myexception,self).__init__()
self.msg = msg
def __str__(self):
return "<%s>" % self.msg
raise Myexception("我自己的异常处理类型")
最后
以上就是传统指甲油为你收集整理的python的异常处理的全部内容,希望文章能够帮你解决python的异常处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复