Python]python编程常见错误异常的原因以及Exception和Raise的异常处理详解(2)

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的异常处理的基本介绍,如有问题以及不合理地方,请私聊我指出,十分感谢,制作不易,希望您可以关注我,与我一同成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值