活用异常处理(try-except)

介绍

简要介绍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 zero

divide('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 zero

divide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'

捕获所有异常并执行相同的处理

如果要捕获所有异常,则无需指定异常名称即可编写。

try:
    print(1 / 0)
except:
    print('Error')
# Error

如果有多个 except 子句,则只能在最后一个 except 子句中省略异常名称。 (就像 if 语句中的 elifelse 一样)

正常结束处理: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 finish

divide(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')

猜你喜欢

转载自blog.csdn.net/Allan_lam/article/details/134931949