在工作中都会遇到异常报错问题,那么在这抽空码一些内容以作记录。
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError #输入/输出异常;基本上是无法打开文件
ImportError #无法引入模块或包;基本上是路径问题或名称错误
IndentationError #语法错误(的子类) ;代码没有正确对齐
IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError #试图访问字典里不存在的键
KeyboardInterrupt #Ctrl+C被按下
NameError #使用一个还未被赋予对象的变量
SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError #传入对象类型与要求的不符合
UnboundLocalError #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError #传入一个调用者不期望的值,即使值的类型是正确的
# 其他异常
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
如何处理异常:
python解释器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行
#一个简单得例子,
>>> Print("Hello World")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Print("Hello World")
NameError: name 'Print' is not defined
NameError 错误被抛出,同时 Python 还会打印出检测到的错误发生的位置。这就是一个错误处理器
程序运行中的异常可以分为两类:语法错误和逻辑错误。首先,我们必须知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。
使用if判断式可以异常处理,但是if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。而且在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差。
#我们平时用if做的一些简单的异常处理
num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
print('输入的是空,就执行我这里的逻辑')
else:
print('其他情情况,执行我这里的逻辑')
#这些if,跟代码逻辑并无关系,显得可读性极差,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
python特定的语法结构捕获异常
#异常捕获 单个分支
try:
逻辑代码(被捕获得内容)
except 异常类型:
检测到异常,就执行这个位置的逻辑
# 多个分支捕获
# 单分支只能用来处理指定的异常情况,如果未捕获到异常,则报错
try:
abc()
except ValueError:
print('异常输出')
except IndexError:
print('异常输出')
# Exception 属性可以捕获任意异常,不过它是一把双刃剑,有利有弊,我们要视情况使用
try:
abc()
except Exception as e:
print(e)检测到异常,就执行这个位置的逻辑
# try...else语句
try:
abc()
except Exception as e:
print(e)
else:
print('') #当try语句中的代码没有异常,就执行else中的代码
# try...finally语句
try:
abc()
except Exception as e:
print(e)
finally:
print('') #不论try中有没有异常,finally都会执行
#自主出发异常 关键字 raise
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
断言处理 assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
语法:
assert expression[,reason]
assert 表达式 [, 参数]
assert语句一般用于对程序某个时刻必须满足的条件进行验证,仅当”debug” 为True时有效。当PYthon脚本以_()选项编译为字节码文件是,assert语句将被移除以提高运行速度。
>>> assert len([1,2,3,4,5,6]) >=5 #列表元素个数小于5
>>> assert 2==1 #2不等于1
Traceback (most recent call last):
File "<stdin>", line 25, in <module>
assert 2==1 #2不等于1
AssertionError
# 格式:assert 条件 , 条件为false时的错误信息, 结果为raise一个AssertionError出来
用sys模块回溯最后的异常
当发生异常时Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这是可以使用sys模块回溯最近一次异常。语法为:
import sys
try:
block
except:
t==sys.exc_info()
print(t)
"""
sys.exc_info()返回值是一个三元组(type,value/message,traceback)。其中,type表示异常的类型,value/message表示异常的信息或者参数,而traceback则包含调用栈信息的对象。
sys.exc_info()可以直接定位最终引发异常的原因,结果比较简洁,但是缺点是难以直接确定引发异常的代码位置
"""
语法结构:
raise [exceptionName [(reason)]]
其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。
每次执行 raise 语句,都只能引发一次执行的异常。
#举个简单例子
try:
a = 2
#判断是否为 1
if a != 1:
raise ValueError("a 不为 1")
except ValueError as e:
print("引发异常:",repr(e))
"""
运行结果为:
引发异常: ValueError('a 不为 1',)
"""
#定义一个异常类,继承Exception
class Networkerror(Exception):
def __init__(self):
pass
def __str__(self):
return "这是一个异常说明!"
try:
raise Networkerror() # raise 出这个异常
except Networkerror as e:
print(e)
"""
输出: 这是一个异常说明!
"""
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180904.html原文链接:https://javaforall.cn