介绍
简要介绍Python的异常处理(try-except)。
基本语法
Try-except是Python中异常处理的基础。
作为例子,我们将解释执行除零时发生 ZeroDivisionError 的情况。
当除以零时,会出现以下错误。
print(1 / 0)
# ZeroDivisionError: division by zero
要捕获此异常,请编写如下。
try:print(1 / 0)
except ZeroDivisionError:print('Error')
# Error
如果 try 子句中出现异常名称的错误,except异常名称会中断 try 子句中的代码并执行 except 子句中的代码。
此外,通过使用 except 异常名称作为变量名,可以在变量中存储和使用异常对象。 异常对象存储错误消息,可以查看错误的详细信息。
try:print(1 / 0)
except ZeroDivisionError as e:print(e)print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
还可以通过指定基类来捕获。 例如,ZeroDivisionError 的基类是 ArithmeticError。 该变量存储实际发生的派生类异常对象。
try:print(1 / 0)
except ArithmeticError as e:print(e)print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
对多个异常进行不同的处理
如果要捕获多个异常并以不同的方式处理它们,请为每个异常设置 except 。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)except TypeError as e:print('catch TypeError:', e)divide(1, 0)
# catch ZeroDivisionError: division by zerodivide('a', 'b')
# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'
对多个异常执行相同的操作
通过在元组中指定异常名称,可以使用一个 except 子句捕获多个异常。
def divide(a, b):try:print(a / b)except (ZeroDivisionError, TypeError) as e:print(e)divide(1, 0)
# division by zerodivide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'
捕获所有异常并执行相同的处理
如果要捕获所有异常,则无需指定异常名称即可编写。
try:print(1 / 0)
except:print('Error')
# Error
如果有多个 except 子句,则只能在最后一个 except 子句中省略异常名称。 (就像 if 语句中的 elif 和 else 一样)
正常结束处理:else
可以指定在 try 子句结束且 else 子句中不发生异常的情况下要执行的处理。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)else:print('finish (no error)')divide(1, 2)
# 0.5
# finish (no error)divide(1, 0)
# catch ZeroDivisionError: division by zero
处理总是在终止时执行:finally
可以在finally子句中指定始终在最后执行的过程,无论是否发生异常。
def divide(a, b):try:print(a / b)except ZeroDivisionError as e:print('catch ZeroDivisionError:', e)finally:print('all finish')divide(1, 2)
# 0.5
# all finishdivide(1, 0)
# catch ZeroDivisionError: division by zero
# all finish
概括
- except 异常名称:捕获特定异常
- except 异常名称作为变量名称:将异常对象存储在变量中
- except可以设置多个例外。
- 如果 except 中没有指定异常名称,则捕获所有异常。
try:print(1 / 0)
except: # 如果try中出现异常print('Error')
else: # 如果try中没有出现异常print('finish (no error)')
finally: # 无论异常如何发生,始终执行print('all finish')