文章目录
- 一、异常的相关概念
- 一、异常捕获关键字
- 三、异常捕获完整格式
- 四、as result解释
- 五、相关实例
- 举例1:捕获特定异常
- 举例2:捕获多个异常
- 举例3:完整的异常格式
- 六、自定义异常类
- 总结
一、异常的相关概念
异常:
程序在运行时,如果Python 解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常抛出异常:
程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常
一、异常捕获关键字
关键字 | 用处 | 备注 |
try/except | 异常捕获和处理关键字 | 必须存在 |
pass | 异常绕过关键字 | 非必须存在 |
as X | 实例化返回的异常类为 | 非必须存在 |
else | 未发生异常时,则执行该代码块 | 非必须存在 |
finally | 无论是否发生异常,最后都必须执行的代码块 | 非必须存在 |
raise | 抛出异常,相当于函数中的return | 非必须存在 |
从上表中可以看出,一般情况下的异常,只需要含有try/except关键字即可,剩下的主要是根据自己的需求适当添加
三、异常捕获完整格式
try:
#可能存在异常的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except 错误类型2:
#针对错误类型2,对应的代码处理
pass
except(错误类型3,错误类型4):
#针对错误类型3和4,对应的代码处理
pass
except Exception as result: # 实例化异常类,用于调用异常相关信息
#打印错误信息
print(result)
else:
#没有异常执行的代码
pass
finally:
#无论是否有异常,都会执行的代码
print('无论是否有异常,都会执行的代码')
举例:
try:
print(num)
except Exception as result:
print(result)
pass
else:
print("未发生异常")
finally:
print("最终需要执行的代码")
结果演示:
四、as result解释
- 异常在
Python
中也是对象,可以对它进行操作,BaseExcepton
是所有异常的基类,其中我们常用的Exception
也是继承了BaseException
.先举一个简单的例子:如果只想知道代码块发生错误了,可以像下面这样写:
try:
print(2/0)
except:
print("发生错误了") # 输出为: 发生错误了
如果我们想要知道具体发生了什么错误,我们可以用Exception接收异常信息:
try:
print(2/0)
except Exception:
print(Exception)
print("发生错误了")
运行结果:
这里可以看出,用Exception接收的是class Exception类,想要具体的调用它,我们就引入了
as result
,定义一个异常实例result,这样就可以具体的查看异常的信息,如下:
try:
print(2/0)
except Exception as result: # 定义一个异常实例result
print(result)
print("发生错误了")
运行结果:
这里的
except Exception
是可以捕获所有的异常
五、相关实例
举例1:捕获特定异常
try:
n = int(input("请输入数字:"))
p = 10/n
except ValueError as result:
print(result)
print("请输入正确的整数")
except ZeroDivisionError as result:
print(result)
print('除0错误')
运行结果1:
运行结果2:
- 从上面的例子可以看出,
ZeroDivisionError
和ValueError
都是异常类,和Exception
是相同性质的,区别是Exception是基类,可以捕获所有异常类,而Zero
和Value
是具体的特定异常类,只能捕获一种异常类.
- 这里需要注意的是,在try语句块中,如果出现异常,则解释器会直接
raise
异常,后面的语句都不会执行,这里和函数中的return
关键字的性质一样,例子如下:
try:
n = int(input("请输入数字:"))
p = 10/n
print("你猜猜这里会调用吗?")
except ZeroDivisionError as result:
print(result)
print('除0错误')
运行结果:
举例2:捕获多个异常
- 一种是
区分
优先级,则每个特定异常类都跟在except语句后;
格式如下:
try:
可能存在异常的代码块
except 特定异常类1:
print('异常说明1')
except 特定异常类2:
print('异常说明2')
except 特定异常类3:
print('异常说明3')
else :
print('未发生异常')
执行特点:
- 当
try
代码块中抛出(出现)异常,则按照except
的顺序,依次查找抛出的异常属于哪一个except
- 如果有
Exception
异常类捕获,一般默认放在最后一个except
后 - 如果所有的
except
都不匹配,则执行else
语句后的代码
- 另一种是不区分优先级,则将多个特定异常类都跟在同一个
except
关键字后
格式如下:
try:
可能存在异常的代码块
except (特定异常类1,特定异常类2...) as result:
print('异常说明')
else :
print('未发生异常')
举例:
try:
n = int(input("请输入数字:"))
p = 10/n
print("你猜猜这里会调用吗?") # 上面语句抛出异常,这条语句就不会执行了
except (ValueError,ZeroDivisionError) as result:
print(result)
print("发生错误了")
运行结果:
举例3:完整的异常格式
str = '人生苦短,我用Python'
try:
int(str) # 这里将字符串强制类型转换为int类型,会出错
except IndexError as result:
print(result)
pass
except KeyError as result:
print(result)
pass
except ValueError as result:
print(result)
pass
else:
print('try内无异常')
finally:
print('无论异常与否,都会执行该finally语句')
运行结果:
六、自定义异常类
要求
:针对用户输入的密码长度进行异常捕获,自定义一个密码长度异常类,进行抛出异常和捕获异常.
代码:
class PassShortError(Exception):
def __init__(self,len,m_len):
self.len = len
self.m_len = m_len
def __str__(self):
return "您输入的密码位数为%d,最小位数为%d" % (self.len,self.m_len)
try:
password = input("请输入密码")
if len(password) < 5:
raise PassShortError(len(password),5) # 这里抛出异常类
except PassShortError as result: # 捕获异常
print(PassShortError) # 这里打印一下捕获的是什么异常类
print(result) # 这里是调用了result的魔法方法__str__
else:
print("该密码输入没有错误")
运行结果:
- 从上面的例子可以看出,实际工作中,我们需要根据实际需求自定义异常类,在定义异常类的时候,上面的就是
最基础
的自定义异常类的格式,可以按照这样的模板自己定义异常类.
总结
异常
是我们在日常编码中绕不开的东西,我们可以把一些有可能发生异常的的代码块放在try/except
中进行异常捕获,在面对程序报错的时候,仔细阅读异常提示,自己先尝试着解决问题,这样才可以得到更快更扎实的进步.