赞
踩
在编写Python程序时,有时我们不确定一段语句是否可以正确执行,因为如果发生错误,那么程序就会终止,这样对完整代码实现很不友好。我们希望可以程序可以根据不同的错误(异常)从而执行不同的语句,达到解决错误的效果。
为了捕获异常,在编码过程中,我们可以简单使用 try/except 语句来捕捉异常,具体语法如下:
try: # 尝试运行的语句(可能会发生异常,也可能不会发生异常)
<语句>
except (异常类型1, 异常类型2, ...): # 如果发生异常类型1时的操作
<语句>
else: # 如果没有发生异常的操作(可选)
<语句>
finally: # 不管有没有发生异常都会执行的操作
<语句>
上面的代码实现了:通过监视 try 语句块中的错误,从而让 except 语句捕获异常信息并进行处理。因此,如果你不想在异常发生时结束你的程序,就需要在 try 语句块中捕获相应的异常。
我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?首先要分清楚程序发生异常和程序执行错误,它们完全是两码事:
程序由于错误导致的运行异常,是需要程序员想办法解决的 —— 一般使用try…except…语句或者直接debug
但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常。
raise 语句的基本语法格式为:raise [exceptionName [(reason)]]
其中, exceptionName和reason 为均可选参数,前者的作用是指定抛出的异常名称,后者为异常信息的相关描述。
也就是说,raise 语句有如下三种常用的用法:
>>> # 1. 单独一个raise >>> raise Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: No active exception to reraise >>> # 2. raise exceptionName >>> raise ZeroDivisionError Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError >>> raise NoArgumentsError Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoArgumentsError' is not defined # exception需要符合规定,不行自己乱写 >>> NoArgumentsError = "没有参数异常" >>> raise NoArgumentsError Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: exceptions must derive from BaseException # exception需要符合规定,不行自己乱写 >>> raise Exception("NoArgumentsError") Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception: NoArgumentsError >>> # 3. raise exceptionName(reason) >>> raise ZeroDivisionError("除零错误!") Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: 除零错误
我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except (else finally)异常处理结构来捕获并进行处理。
虽然程序中使用了 raise 语句引发异常,但程序的执行是正常的,手动抛出的异常经过合适的处理并不会导致程序崩溃。
# raise默认引发的异常 try: num = input("请输入一个数字:") if not num.isdigit(): raise else: print(f"输入为: {num}") except RuntimeError as e: print(f"异常[{e}]触发") """ 请输入一个数字:leovin 异常[No active exception to reraise]触发 """ #--------------------------------------------------------------------------------------------------------------- # 不指定except需捕获的异常 try: num = input("请输入一个数字:") if not num.isdigit(): raise else: print(f"输入为: {num}") except: print(f"异常触发") # 但这样我们就不知道具体是什么异常发生了! """ 请输入一个数字:leovin 异常触发 """
1.无论有无异常,finally代码段一定会被执行
2.若有异常,则执行except代码段
3.若无异常且无return,则执行else代码段
4.若无异常且有return,try代码段中有return语句,则else代码段不会被执行
5.若无异常且有return,try代码段没有return语句,则else代码段会执行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。