概述
在工作中都会遇到异常报错问题,那么在这抽空码一些内容以作记录。
在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
语法结构:
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)
-
-
"""
-
输出: 这是一个异常说明!
-
"""
最后
以上就是饱满小馒头为你收集整理的python_所有异常raise的全部内容,希望文章能够帮你解决python_所有异常raise所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复