Python 异常处理

1,137 阅读3分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

异常

在Python程序开发中,经常会遇到两种错误,一种是语法错误,是指程序未按照语法规范进行编写,进而不能正常运行;另外一种是异常,是指在符合语法规范的前提下,程序由于逻辑错误或其他原因导致的错误,故也被称之为运行时错误。

在Python中,如果我们没有事先对有可能出现异常进行捕获处理,程序运行中遇到异常就会终止执行,会以Traceback错误提示信息的形式展示出来,以便我们找到异常出现的原因,例如:

a = 20 / 0
print(a)

Traceback (most recent call last):
  File "C:\Users\Dell\PycharmProjects\py_example\exceptiondemo.py", line 1, in <module>
    a = 20 / 0
ZeroDivisionError: division by zero

错误提示信息会显示异常发生的具体位置及异常的类型,例如上面提示我们异常发生在exceptiondemo.py文件第1行a = 20 / 0代码,异常为ZeroDivisionError,表示除数为0的异常。

处理异常

except语句捕获异常信息并处理

在Python中,使用try...excepttry...except...else.....finally语句来捕获和处理异常。

  • try语句用来检测语句块中有没有异常;
  • except语句捕获异常信息并处理;
  • else语句,在try语句块内没有异常的情况下执行;
  • finally语句无论try语句内是否有异常,都要执行。

执行逻辑为:

  • 首先,执行try语句块。
  • 如果try语句块内没有异常发生,则跳过except语句,执行else语句(在else语句有的情况下)。
  • 如果try语句块内发生了异常,则跳过发生异常处下面的代码,来到except语句,如果异常的类型和except接收的异常类型匹配,则执行except语句块;如果不匹配,则该异常会被传递到上一层try语句,如果最终没找处理程序,程序就会停止运行,并向我们打印Traceback错误提示信息。
  • 最后,无论try语句内是否有异常,finally语句都要执行(在finally语句有的情况下)。

例如:

def func(a, b):
    try:
        result = a / b
        print("result = a / b执行完毕")
    except ZeroDivisionError as e:
        print("{}/{}发生异常:{}".format(a, b, str(e)))
    else:
        print("{}/{}执行结果result为:{}".format(a, b, result))
    finally:
        print("finally程序结束")


func(20, 4)
func(20, 0)
func(20, "b")

执行结果如下:

image.png

raise语句

Python中的raise关键字用于手动引发一个异常,可以理解为Java中的throw关键字。例如:

def raise_exception():
    raise Exception("这是一个异常")


raise_exception()

执行结果如下: image.png

此处,raise关键字后面是抛出是一个通用的异常类型Exception,一般来说抛出的异常越详细越好。

自定义异常

除了使用Python内置的异常,我们还可以自定义自己的特殊类型的异常,只需要创建一个类,并继承Exception类或其子类即可。例如:

class MyException(Exception):
    # 自定义异常,继承自异常类
    def __init__(self, name, reason):
        self.name = name
        self.reason = reason


try:
    age = -3
    if age < 0:
        raise MyException("ValueException", "age 小于 0")
except MyException as e:
    print(e.name + ":" + e.reason)
   
# 执行结果为 ValueException:age 小于 0

上面我们创建了一个异常MyException继承自Exception,用于在异常触发时输出更多的信息。定义好之后就可以在except语句后使用MyException异常。也可以通过raise语句手动触发这个异常。

总结

Python所有的异常类都是从BaseException类派生的,详细的错误类型和继承关系:Exception hierarchy。通过对异常的处理,可以提高程序的容错性与健壮性,有效的控制程序故障停止运行的发生。

最后,感谢女朋友在工作和生活中的包容、理解与支持 !