Exception异常处理
try/except语法结构
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它,其语法格式如下:
try:
try_block
except [ExceptionType[as alias]]:
except_block
except (ExceptionType1, ExceptionType2,...) as alias:
except_block
except Exception [as alias]:
except_block
[else:
else_block]
[finally:
fanally_statements](无论异常是否发生,都执行)
#其中[]中的语句可写可不写
#try_block:表示正常操作,但可能发生异常的代码块
#ExceptionType:具体异常名字
#as alias:可选参数,表示给前面的的异常指定一个别名
#except Exception [as alias]:表示捕获所有异常
#else_block:如果没有异常执行这块代码
具体语法结构剖析
- try...except必须放在可能发生意外的代码块中,即try_block代码块
- except用于捕获异常,一旦捕捉到异常,执行与之对应的except_block代码块
这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容 - 其中ExceptionType是异常类型名(ZeroDivisionError、IndexError等)。
- [as alias]可以给捕捉到的异常取一个别名,可以通过该变量获得异常相关的信息。
- 不带任何异常类型使用except,将捕获所有发生的异常。不推荐这么使用,因为我们不能通过该程序识别出具体的异常信息。
- 当try_block代码块并未发生异常,会跳过except,执行else_block
- 当try_except程序结束,finally 语句无论是否发生异常都将执行最后的代码。
try核心工作原理
当你开始一个try语句时,Python实际上是在当前的执行上下文中设置了一个标记点。这个标记点的作用是,如果后续的代码执行中出现了异常,Python能够知道应该回到哪里去处理这个异常。
try子句首先被执行,这时有两种可能的情况:
- 如果try子句中的代码正常执行,没有抛出任何异常,那么Python会继续检查是否有else子句。如果存在else子句,它会执行else子句中的代码,然后整个try-except-else结构就算执行完毕,控制流继续向后进行。
- 如果在try子句执行过程中发生了异常,Python会立即中断当前的执行流程,并查找与这个异常类型相匹配的except子句。一旦找到匹配的except子句,Python就会执行该except子句中的代码来处理这个异常。处理完毕后,控制流会跳过try子句后面的其他代码(包括任何可能存在的else子句),直接继续执行try-except结构之后的代码。
如果在try子句执行过程中发生了异常,但没有一个except子句能够匹配这个异常的类型,那么这个异常会被继续向上抛出,直到找到能够处理它的上层try结构,或者直到程序的最顶层。如果到达程序的最顶层仍然没有找到处理这个异常的代码,Python就会打印默认的出错信息,并终止程序的执行,其流程图如下所示:
通过这种方式,try-except结构允许我们编写能够优雅地处理异常情况的代码,提高程序的健壮性和容错能力。
代码示例如下:
#eval() 函数将字符串转换为相应的对象,并返回表达式的结果。
try:
try:
x = eval(input("请输入被除数x:\t"))
y = eval(input("请输入 除数 y:\t"))
z = x/y
except NameError:
print("NameError")
except SyntaxError:
print("SyntaxError")
finally:
print("离开try...except 模块")
except ZeroDivisionError as err:
print(type(err), err)
else:
print("未捕捉到异常", z)
以上代码理解以下不难,发生了ZeroDivisionError,但是最底层try语句无法捕捉,抛出给到上层try
Raise异常处理
除了系统抛出的异常,我们也可以使用raise语句自己触发异常,类似C++的throw
raise的语法结构如下:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。代码示例如下:
- 并未存在except捕捉
try: print("test start") raise NameError("has been raised") except RuntimeError as err: print(err.args) else: print("未捕捉到异常")
- 存在except捕捉
try: print("test start") raise NameError("has been raised") except RuntimeError as err: print(err.args) except NameError: print("NameError has been catched") else: print("未捕捉到异常")
以上就是关于python编程常见错误异常的原因以及Exception和Raise的异常处理的基本介绍,如有问题以及不合理地方,请私聊我指出,十分感谢,制作不易,希望您可以关注我,与我一同成长!