本文主要梳理一下 Python 异常 Exception 处理 ,更多 Python 基础系列,请参考Python 基础系列大纲
内容提要:
- 异常 Exception 对象
- 异常处理 Exception Handling
关键字机制支持异常处理
try -> except -> else -> finally
分组异常处理
泛型异常 Exception Handling
raise 抛出异常 - 异常角色说明
下面例子是日常 Python 代码中遇到常见的异常:
什么是异常对象?
异常 Exception 对象是管理运行时抛出的错误。
异常对象的用途?
帮助处理类似下面状况:
- 文件不存在
- 除 0
- index 越界
异常发生的现象:
Python 代码会中断并打印栈跟踪信息,用来解释哪个文件,哪行代码出现异常。
为什么处理异常?
- 阻止代码崩塌
- 提高代码健壮性,防止恶意地中断程序
- 提高程序的可用性,稳定性
不同异常类型对应的异常对象:
关键字机制支持异常处理
- Try --> 捕获 Catch 异常 exceptions
- except, else, 和 finally --> 从异常中恢复
处理异常
报告异常 - raise --> 抛出异常
从用户代码中显示地抛出异常
try -> except -> else -> finally
try: 捕获异常
except: 处理异常
else: 没有异常时执行
finally: 无论是否异常都会最后执行
实践
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: | 无论异常与否都会执行 |
练习作业:
热门文章
- 学美容的正规学校学费(学美容的学费大概是多少钱呀)
- Linux 下清空或删除大文件/大量文件的几种方法
- 宠物医生资格证报名时间2023(宠物医生资格证报名时间2023)
- 「12月1日」最高速度20.5M/S,2024年V2ray/Shadowrocket/Clash/SSR每天更新免费节点订阅链接
- 宠康宠物医院怎么样(宠康宠物店)
- 「11月6日」最高速度22.7M/S,2024年Shadowrocket/V2ray/Clash/SSR每天更新免费节点订阅链接
- 「12月9日」最高速度18.2M/S,2024年Shadowrocket/Clash/V2ray/SSR每天更新免费节点订阅链接
- 动物医院诊室如何管理 动物医院诊室如何管理好
- 自己能给宠物打疫苗吗(自己给宠物打疫苗能开检疫证明吗)
- 「1月20日」最高速度22.3M/S,2025年Shadowrocket/SSR/V2ray/Clash每天更新免费订阅地址分享