Python 基础系列 11 – Python 异常处理 Exception Handling

2022年10月11日08:17:45

引言

本文主要梳理一下 Python 异常 Exception 处理 ,更多 Python 基础系列,请参考Python 基础系列大纲

内容提要:

  • 异常 Exception 对象
  • 异常处理 Exception Handling
    关键字机制支持异常处理
    try -> except -> else -> finally
    分组异常处理
    泛型异常 Exception Handling
    raise 抛出异常
  • 异常角色说明

异常 Exception 对象

下面例子是日常 Python 代码中遇到常见的异常:
Python 基础系列 11 - Python 异常处理 Exception Handling
什么是异常对象?
异常 Exception 对象是管理运行时抛出的错误。

异常对象的用途?
帮助处理类似下面状况:

  • 文件不存在
  • 除 0
  • index 越界

异常发生的现象:
Python 代码会中断并打印栈跟踪信息,用来解释哪个文件,哪行代码出现异常。

为什么处理异常?

  • 阻止代码崩塌
  • 提高代码健壮性,防止恶意地中断程序
  • 提高程序的可用性,稳定性

不同异常类型对应的异常对象:
Python 基础系列 11 - Python 异常处理 Exception Handling

异常处理 Exception Handling

关键字机制支持异常处理

  • Try --> 捕获 Catch 异常 exceptions
  • except, else, 和 finally --> 从异常中恢复
    处理异常
    报告异常
  • raise --> 抛出异常
    从用户代码中显示地抛出异常

try -> except -> else -> finally

try: 捕获异常
except: 处理异常
else: 没有异常时执行
finally: 无论是否异常都会最后执行
Python 基础系列 11 - Python 异常处理 Exception Handling
实践

n=input('Nominator: ')d=input('Denominator: ')try:devision=float(n)/float(d)exceptZeroDivisionErrorase:print('Error handle-Exception: {} \n Type: {} \ \n Tuple of Messages: {} '.format(e,type(e),e.args))else:print('Perform_if_try_is_successfully')finally:print('Always perform action: Trying to divide…')

没有异常时, 执行 else->finally

#output:Nominator:6Denominator:2Perform_if_try_is_successfullyAlwaysperformaction:Tryingtodivide…

异常发生, 执行 exception->finally
e.args: 异常的额外一些信息

#output:Nominator:6Denominator:0Errorhandle-Exception:floatdivisionbyzeroType:<class'ZeroDivisionError'>\TupleofMessages:('float division by zero',)Alwaysperformaction:Tryingtodivide…

异常发生, 但是异常类型不匹配, 执行 finally->并抛出异常
注意因为没有处理异常,会打印栈跟踪信息。

#output:Nominator:aaDenominator:3Alwaysperformaction:Tryingtodivide…---------------------------------------------------------------------------ValueErrorTraceback(mostrecentcalllast)<ipython-input-282-3eb1b8a9856e>in<module>2d=input('Denominator: ')3try:---->4devision=float(n)/float(d)5exceptZeroDivisionErrorase:6print('Error handle-Exception: {} \n Type: {} \ \n Tuple of Messages: {} '.format(e,type(e),e.args))ValueError:couldnotconvertstringtofloat:'aa'

分组异常处理

n=input('Nominator: ')d=input('Denominator: ')try:devision=float(n)/float(d)except(ValueError,ZeroDivisionError)ase:print('Error handle-Exception: {} \n Type: {} \ \n Tuple of Messages: {} '.format(e,type(e),e.args))else:print('Perform_if_try_is_successfully')finally:print('Always perform action: Trying to divide…')

泛型异常 Exception Handling

避免泛型异常处理,最好指明异常类型。

n=input('Nominator: ')d=input('Denominator: ')try:devision=float(n)/float(d)exceptExceptionase:print('Error handle-Exception: {} \n Type: {} \ \n Tuple of Messages: {} '.format(e,type(e),e.args))else:print('Perform_if_try_is_successfully')finally:print('Always perform action: Trying to divide…')

raise 抛出异常

用于明确地抛出内建的或用户自定义的异常。

raise Exception_type ([value])

例如: raise RuntimeError (“Unrecoverable Error”)

defdivide_operation(nominator,denominator):ifdenominator==0:raiseZeroDivisionError("Which grade are you in")else:returnfloat(nominator)/float(denominator)print(divide_operation(5,2))divide_operation(5,0)
#output:2.5---------------------------------------------------------------------------ZeroDivisionErrorTraceback(mostrecentcalllast)<ipython-input-291-7c2394d04a90>in<module>67print(divide_operation(5,2))---->8divide_operation(5,0)<ipython-input-291-7c2394d04a90>individe_operation(nominator,denominator)1defdivide_operation(nominator,denominator):2ifdenominator==0:---->3raiseZeroDivisionError("Which grade are you in")4else:5returnfloat(nominator)/float(denominator)ZeroDivisionError:Whichgradeareyouin

异常角色说明

关键字 说明 举例
except: 捕获所有异常
except type: 捕获某一特定类型的异常 except ZeroDivisionError:
except type as value: 捕获某一特定类型的异常并实例化 except ZeroDivisionError:
except (type1, type2): 捕获多个类型的异常 except (IOError, TypeError):
except (type1, type2) as value: 捕获多个类型的异常并实例化 except (NameError, TypeError) as e:
else: 没有异常时执行
finally: 无论异常与否都会执行

练习作业:
Python 基础系列 11 - Python 异常处理 Exception Handling

  • 作者:wumingxiaoyao
  • 原文链接:https://blog.csdn.net/wumingxiaoyao/article/details/108954761
    更新时间:2022年10月11日08:17:45 ,共 3409 字。