ToB企服应用市场:ToB评测及商务社交产业平台
标题:
32-异常捕获与抛出工具
[打印本页]
作者:
民工心事
时间:
2024-5-10 17:33
标题:
32-异常捕获与抛出工具
异常捕获与抛出工具
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。
运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
>>> 10 * (1/0) # 0 不能作为除数,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3 # spam 未定义,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2 # int 不能与 str 相加,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
复制代码
抛出异常: raise 语句
当想要主动抛出异常时,可以使用 raise 语句,语法格式如下:
raise_stmt ::= "raise" [expression ["from" expression]]
复制代码
实现语法:
raise [Exception [, args [, traceback]]]
复制代码
实现案例:
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
复制代码
执行以上代码会触发异常:
Traceback (most recent call last):
File "test.py", line 3, in <module>
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
复制代码
注意:
如果不给 raise 参数,则 raise 会重新引发当前的异常(active exception)。
如果当前没有异常,则会引发 RuntimeError。
异常处理:try 语句
try 语句可为一组语句指定异常处理句柄和/或清理代码,语法格式如下:
try_stmt ::= try1_stmt | try2_stmt | try3_stmt
try1_stmt ::= "try" ":" suite
("except" [expression ["as" identifier]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
try2_stmt ::= "try" ":" suite
("except" "*" expression ["as" identifier] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
try3_stmt ::= "try" ":" suite
"finally" ":" suite
复制代码
try 语句按照如下方式工作;
首先,执行 try 子句。
如果没有异常发生,且 else 子句存在则执行else子句。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。
如果 except 子句存在且异常的类型和 except 之后的名称相符,
那么对应的 except 子句将被执行。
如果一个异常没有捕获,那么这个异常将会传递给上层的 try 中。
最后,执行finally 语句。结束后抛出未被except捕获的异常。
一个 try 语句可能包含多个 except 子句,来处理不同的异常,
但最多只有一个分支会被执行。
一个 except 子句可以同时处理多个异常,
将需要处理的异常打包成一个元组,例如:
except (RuntimeError, TypeError, NameError):
pass
复制代码
如果 except 后忽略异常名称,则会捕获所有类型的异常。
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
复制代码
参考资料:
Python 文档:复合语句
菜鸟教程:Python3 错误与异常
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4