异常信息保存方法 save exception

使用 sys.exc_info() -> tuple[Exception_type, Exception_object, Traceback_object]

异常处理工具:

  • 获取: sys.exc_info()

    • traceback 获取:

      • your_exception.__traceback__
  • 转换成字符串和打印: traceback 模块

    • 字符串:

      • 异常栈: traceback.format_tb(traceback_object)
      • 异常类: traceback.format_exception(exception_object)
      • 当前异常类: traceback.format_exc()
    • 打印:

      • 异常栈: traceback.print_tb(traceback_object)
      • 异常类: traceback.print_exception(exception_object)
      • 当前异常类: traceback.print_exc()
  • 最后一个异常获取:

    • sys.last_value
    • sys.last_exec
    • sys.last_traceback

参考:

例子:

保存

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
In [89]: try:
    ...:     1/0
    ...: except Exception as e:
    ...:     info =  sys.exc_info()
    ...:

In [90]: info
Out[90]:
(ZeroDivisionError,
 ZeroDivisionError('division by zero'),
 <traceback at 0x7fd61bb7ed80>)

使用保存的异常

1
raise info[1].with_traceback(info[2])

给定转换成字符串

  • 使用 traceback.format_exception(your_err) --> str, 转换成字符串 方法
  • 打印 traceback.print_exception(your_err)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import traceback
s = traceback.format_exception(info[1])
s = traceback.format_exception(ValueError("error"))

try:
    1/0
except Exception as e:
    s = traceback.format_exception(e)
    print(s)


#['Traceback (most recent call last):\n', '  File "<ipython-input-114-bdee53ac0349>", line 2, in <module>\n    1/0\n    ~^~\n', 'ZeroDivisionError: division by zero\n']

当前被捕获的异常,转换和打印

traceback.format_exc()traceback.print_exc()

IOError

磁盘空间不足

使用 errno 模块

1
2
3
4
5
6
7
8
import errno
from pathlib import Path

try:
    Path("./test.txt").write_text("hello world")
except IOError as e:
    if e.errno == errno.ENOSPC:
        print("磁盘空间不足")