python raise用法

发布时间 2023-12-18 11:39:25作者: CodeRabbit_joion

以下面一段代码为例:

# !/usr/bin/env python3
# -*- coding:utf8 -*-
"""test except"""
import os
import sys

if __name__ == '__main__':
    
    try:
        raise IndexError
    except Exception as e:
        raise ValueError
        # raise ValueError from e
        # raise ValueError from None

  若 raise ValueError 则获得:在抛出IndexError的同时出现ValueError

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    raise IndexError
IndexError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    raise ValueError
ValueError

  若 raise ValueError from e 则获得:抛出ValueError警告,直接原因是IndexError导致的

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    raise IndexError
IndexError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    raise ValueError from e
ValueError

  若 raise ValueError from None 则直接出现:ValueError,没有给出原因

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    raise ValueError from None
ValueError

  综上来看,raise ValueError from e 效果最好,方便定位到问题所在。

  当然,也可以不用raise ... from结构:

# !/usr/bin/env python3
# -*- coding:utf8 -*-
"""test except"""
import os
import sys

if __name__ == '__main__':
    
    try:
        raise IndexError
    except Exception as e:
        # raise ValueError
        str_e = str(e) + 'something wrong!'
        raise ValueError(str_e)
        # raise ValueError from None

  得出的结果:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    raise IndexError
IndexError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    raise ValueError(str_e)
ValueError: something wrong!