翼度科技»论坛 编程开发 python 查看内容

32-异常捕获与抛出工具

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
异常捕获与抛出工具

即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。
运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
  1. >>> 10 * (1/0)             # 0 不能作为除数,触发异常
  2. Traceback (most recent call last):
  3.   File "<stdin>", line 1, in ?
  4. ZeroDivisionError: division by zero
  5. >>> 4 + spam*3             # spam 未定义,触发异常
  6. Traceback (most recent call last):
  7.   File "<stdin>", line 1, in ?
  8. NameError: name 'spam' is not defined
  9. >>> '2' + 2               # int 不能与 str 相加,触发异常
  10. Traceback (most recent call last):
  11.   File "<stdin>", line 1, in <module>
  12. TypeError: can only concatenate str (not "int") to str
复制代码
抛出异常: raise 语句

当想要主动抛出异常时,可以使用 raise 语句,语法格式如下:
  1. raise_stmt ::=  "raise" [expression ["from" expression]]
复制代码
实现语法:
  1. raise [Exception [, args [, traceback]]]
复制代码
实现案例:
  1. x = 10
  2. if x > 5:
  3.     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
复制代码
执行以上代码会触发异常:
  1. Traceback (most recent call last):
  2.   File "test.py", line 3, in <module>
  3.     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
  4. Exception: x 不能大于 5。x 的值为: 10
复制代码
注意:
如果不给 raise 参数,则 raise 会重新引发当前的异常(active exception)。
如果当前没有异常,则会引发 RuntimeError。
异常处理:try 语句

try 语句可为一组语句指定异常处理句柄和/或清理代码,语法格式如下:
  1. try_stmt  ::=  try1_stmt | try2_stmt | try3_stmt
  2. try1_stmt ::=  "try" ":" suite
  3.                ("except" [expression ["as" identifier]] ":" suite)+
  4.                ["else" ":" suite]
  5.                ["finally" ":" suite]
  6. try2_stmt ::=  "try" ":" suite
  7.                ("except" "*" expression ["as" identifier] ":" suite)+
  8.                ["else" ":" suite]
  9.                ["finally" ":" suite]
  10. try3_stmt ::=  "try" ":" suite
  11.                "finally" ":" suite
复制代码
try 语句按照如下方式工作;

  • 首先,执行 try 子句。
  • 如果没有异常发生,且 else 子句存在则执行else子句。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。
  • 如果 except 子句存在且异常的类型和 except 之后的名称相符,
    那么对应的 except 子句将被执行。
  • 如果一个异常没有捕获,那么这个异常将会传递给上层的 try 中。
  • 最后,执行finally 语句。结束后抛出未被except捕获的异常。
一个 try 语句可能包含多个 except 子句,来处理不同的异常,
但最多只有一个分支会被执行。
一个 except 子句可以同时处理多个异常,
将需要处理的异常打包成一个元组,例如:
  1. except (RuntimeError, TypeError, NameError):
  2.     pass
复制代码
如果 except 后忽略异常名称,则会捕获所有类型的异常。
  1. import sys
  2. try:
  3.     f = open('myfile.txt')
  4.     s = f.readline()
  5.     i = int(s.strip())
  6. except OSError as err:
  7.     print("OS error: {0}".format(err))
  8. except ValueError:
  9.     print("Could not convert data to an integer.")
  10. except:
  11.     print("Unexpected error:", sys.exc_info()[0])
  12.     raise
复制代码
参考资料:

Python 文档:复合语句

菜鸟教程:Python3 错误与异常


来源:https://www.cnblogs.com/wanderoff-night/p/18033448
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具