本文主要梳理一下 Python 异常 Exception 处理 ,更多 Python 基础系列,请参考Python 基础系列大纲
内容提要:
下面例子是日常 Python 代码中遇到常见的异常:
什么是异常对象?
异常 Exception 对象是管理运行时抛出的错误。
异常对象的用途?
帮助处理类似下面状况:
异常发生的现象:
Python 代码会中断并打印栈跟踪信息,用来解释哪个文件,哪行代码出现异常。
为什么处理异常?
不同异常类型对应的异常对象:
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…')
避免泛型异常处理,最好指明异常类型。
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 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: | 无论异常与否都会执行 |
练习作业: