异常处理
在编程中我们经常会遇到以下一类的问题
>>> 1/0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
我们称类似这种错误为异常,异常对于我们写代码的人来说一般是比较容易理解的,但是,如果我们的用户碰到了这类问题,那么我们该如何处理呢,也让用户看这样的代码?这样肯定是不可能的,但是我们有另外一种更加友善的方式来解决这类问题—使用异常捕获
什么是异常捕获
异常捕获是 python 以及其他编程语言中针对异常事件的处理方式,能够让我们的代码具有更强的健壮性,或者可以说是鲁棒性,使用异常捕获能够进一步的提升代码的使用范围以及用户友好性
如何使用1
在 Python 中我们使用关键词try
和except
便可以实现简单的异常捕获,
具体用法如下:
然后这样,我们便可以实现一个更加友好的除法器,判断被除数是否为 0
num1 = float(input("Num1: "))
num2 = float(input("Num2: "))
try:
print(num1/num2)
except ZeroDivisionError:
print("除数为0")
except Exception as e:
print(e)
上述代码中,我们如果被除数为0,我们将输出被除数为 0 , 如果出现其它的错误便会执行最后一句输出错误信息
其他用法还有try...except...else
try:
result = num1/num2
except ZeroDivisionError:
print("除数为0")
else:
print(result)
还可以使用try...except...else...finally
格式
try:
result = num1/num2
except ZeroDivisionError:
print("除数为0")
else:
print(result)
finally:
print('程序执行完毕')
那么我们如何知道具体的错误是什么呢?这个其实很简单,当我们犯了这样的错误,python 的解释器便会打印出这样的错误,在输出的信息中我们很容易就知道了其具体的错误,比如在最初的那个例子中,我们就知道错误类型为ZeroDivisionError
,当然常见的错误有:
类型 | 解释 |
---|---|
SyntaxError | 语法错误 |
TypeError: | 类型错误 |
IndentationError | 缩进错误 |
IndexError | 索引错误 |
ValueError | 值错误 |
AttributeError | 属性错误 |
KeyError | 键错误 |
TypeError | 类型错误 |
我们可以同时使用多个except
语句,但是有限匹配写在前面的异常
有时候我们没有必要知道具体的错误类型时,可以用Exception
来进行匹配,可以匹配所有的错误
主动抛出错误
在 Python 中我们可以使用raise
关键词来抛出自己想要抛出的错误,比如在上述中,我们可以使用如下来抛出错误,并可以通过一定的手段进行接收,该方法一般在库中比较常见
print(num1/num2)
if num2 == 0:
raise ZeroDivisionError
定义异常
利用类的知识,我们只要继承 python 中Exception类便可以了
num1 = float(input("Num1: "))
num2 = float(input("Num2: "))
class Error(Exception):
def __init__(self, info):
super().__init__() # 初始化
self.info=info
def __str__(self):
return self.info
try:
if num2 == 0:
raise Error("除数为0")
print(num1/num2)
except Error as e: # 这样要使用别名,不然结果与预期不同
print(e.info)
图片来源于菜鸟教程 ↩︎