一、异常定义
异常指在程序没有语法错误(编译错误)的前提下,在运行期间产生的特定错误。每个特定错误都对应一个异常类对象。
当程序在运行期间产生某个特定错误时,其对应的异常类对象的实例对象就会被抛出。在程序中很难没有对异常的捕获和处理,程序中缺少这一环节,一旦遇到特定错误,会导致程序停止运行,反之,程序会继续运行。例如:
# 程序会卡在第一个输出上,且不会继续往下执行
print(int('port1'))
print("port2")
# 程序提示:ValueError: invalid literal for int() with base 10: 'port1'
# 对可能出现异常的代码段进行捕获和处理异常,当被监测的代码段遇到异常,程序会跳出被监测的代码段,继续向下运行
try:
print(int('port1'))
print("port2")
except Exception as e:
print("port1出现异常")
print("port3")
# 运行结果:
# port1出现异常
# port3
二、异常捕获和处理
异常捕获和处理常见的关键字有try、except、as、Exception、else、finally等,语法结构如下:
# try为异常捕获的关键字,try里面的代码段为异常捕获的代码段
try:
r = int(input("请输入数字:"))
# except为异常处理的关键字,Exception为异常类型,e为对象变量
except Exception as e:
print("请您输入整数!")
# 当没有捕获到异常时才执行
else:
print("当没有捕获到异常时才执行")
# 无论是否捕获到异常都会执行
finally:
print("论是否捕获到异常都会执行")
在语法上except子句能存在多个,每一个对应一种错误类型,有时为避免出现遗漏的错误,会在最后加上BaseException错误类型。对于else和finally则最多出现一个。
上面语法中“e”是异常对象实例(可以是其他名称,以下简称异常对象),异常对象有多种属性,通过调用异常对象属性,能够获得异常的相关信息,常见的属性有:
__traceback__:代码段发生异常时的代码的调用栈信息
__class__:异常的类型
__cause__:如果异常由另一个异常引起,则该属性能指向原始异常
__context__:在处理异常时,如果有异常被捕获并重新引发,则该属性会指向就近异常
args:展示异常的错误编号和详细信息
python常见10大异常
异常类 | 异常类描述 |
TypeError | 当操作或函数应用于不适当类型的对象时引发。 |
ValueError | 当函数或操作的参数具有正确的类型但不合法时引发。 |
NameError | 当尝试访问一个未定义的变量时,会抛出NameError异常。 |
IndexError | 当尝试访问列表、元组或字符串中不存在的索引时引发。 |
KeyError | 当尝试访问字典中不存在的键时引发。 |
ZeroDivisionError | 当尝试除以零时引发。 |
IOError | 当尝试读取不存在的文件或无法访问文件时引发。 |
ImportError | 当尝试导入不存在的模块或包时引发。 |
AttributeError | 当尝试访问对象不存在的属性时引发。 |
KeyboardInterrupt | 当用户中断程序执行时引发。 |
三、自定义异常
在实际编程中,常见的python异常类并不能够完全满足我们的需求,往往通过自定义异常类来满足预期目标。自定义异常的语法格式如下:
# 自定义异常类
class AgeError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self) :
return "Error: "+self.msg
其中,异常类名称后缀建议使用Error,需要继承Exception类。“__str__()”是python中特殊的方法,被称为“魔术方法”,能够自定义对象的字符串表现形式。
四、主动抛出异常
有自定义异常类就不得不提到raise关键字,该关键字用于主动抛出异常,让程序进入异常状态(捕获异常,但未处理),通常在try中引用。Raise使用方法有:
单独使用:raise
单带异常类名称:raise 异常类名称
带异常描述:raise 异常类名称(异常描述)
# 自定义异常类
class AgeError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self) :
return self.__class__.__name__ + ": " +self.msg
def AgeValue(age):
if age < 18:
raise AgeError("您未满18岁")
r = int(input("请输入年龄:"))
try:
AgeValue(r)
except AgeError as e:
print(e)