在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...except
或try...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")
执行结果如下:
Python中的raise关键字用于手动引发一个异常,可以理解为Java中的throw关键字。例如:
def raise_exception():
raise Exception("这是一个异常")
raise_exception()
执行结果如下:
此处,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。通过对异常的处理,可以提高程序的容错性与健壮性,有效的控制程序故障停止运行的发生。
作者:tigeriaf
链接:https://juejin.cn/post/7001776230055804941
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。