Python 异常捕获

1,172 阅读3分钟

异常处理

在编程中我们经常会遇到以下一类的问题

>>> 1/0
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: division by zero

我们称类似这种错误为异常,异常对于我们写代码的人来说一般是比较容易理解的,但是,如果我们的用户碰到了这类问题,那么我们该如何处理呢,也让用户看这样的代码?这样肯定是不可能的,但是我们有另外一种更加友善的方式来解决这类问题---使用异常捕获

什么是异常捕获

异常捕获是 python 以及其他编程语言中针对异常事件的处理方式,能够让我们的代码具有更强的健壮性,或者可以说是鲁棒性,使用异常捕获能够进一步的提升代码的使用范围以及用户友好性

如何使用[1]

在 Python 中我们使用关键词tryexcept便可以实现简单的异常捕获, 具体用法如下: try

然后这样,我们便可以实现一个更加友好的除法器,判断被除数是否为 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

try:
	result = num1/num2
except ZeroDivisionError:
    print("除数为0")
else:
	print(result)

还可以使用try...except...else...finally格式 try

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)

  1. 图片来源于菜鸟教程 ↩︎