python异常类型捕获和类型判断

背景

python对错误的处理通常通过捕获不同类型的异常实现

try:
    ...
except ExceptionType1 as e1:
    ...
except ExceptionType2 as e2:
    ...
except:
    ...

一次调试当中,发现捕获异常时对异常类型的判断和导入路径相关,特此记录。

测试

目录结构如下

./ex/myexception.py
./extest.py

myexception.py文件内容

# encoding=utf8

class MyException(Exception):
    pass

extest.py文件内容

# encoding=utf8

import sys
import traceback
sys.path.append('./ex')

from ex import myexception
from myexception import MyException


def raise_myexception():
    raise myexception.MyException('ex.myexception.Myexception')

def raise_exception():
    raise MyException('myexception.Myexception')


try:
    raise_myexception()
except MyException as e:
    print(traceback.format_exc())
except myexception.MyException as e:
    print(traceback.format_exc())


try:
    raise_exception()
except MyException as e:
    print(traceback.format_exc())
except myexception.MyException as e:
    print(traceback.format_exc())

执行python3 extest.py输出

Traceback (most recent call last):
  File "/Users/admin/test/extest.py", line 19, in <module>
    raise_myexception()
  File "/Users/admin/test/extest.py", line 12, in raise_myexception
    raise myexception.MyException('ex.myexception.Myexception')
ex.myexception.MyException: ex.myexception.Myexception

Traceback (most recent call last):
  File "/Users/admin/test/extest.py", line 27, in <module>
    raise_exception()
  File "/Users/admin/test/extest.py", line 15, in raise_exception
    raise MyException('myexception.Myexception')
myexception.MyException: myexception.Myexception

可以看到,异常捕获只能捕获到和抛出异常类型路径完全相同的异常类型

扩展

我们进一步测试除了异常捕获,对类型判断是否也需要判断引入路径,修改extest.py脚本

# encoding=utf8

import sys
import traceback
sys.path.append('./ex')

from ex import myexception
from myexception import MyException


def raise_myexception():
    raise myexception.MyException('ex.myexception.Myexception')

def raise_exception():
    raise MyException('myexception.Myexception')


try:
    raise_myexception()
except MyException as e:
    print(traceback.format_exc())
    print('%s == %s: %s' % (type(e), myexception.MyException, isinstance(e, myexception.MyException)))
    print('%s == %s: %s' % (type(e), MyException, isinstance(e, MyException)))
except myexception.MyException as e:
    print(traceback.format_exc())
    print('%s == %s: %s' % (type(e), myexception.MyException, isinstance(e, myexception.MyException)))
    print('%s == %s: %s' % (type(e), MyException, isinstance(e, MyException)))


try:
    raise_exception()
except MyException as e:
    print(traceback.format_exc())
    print('%s == %s: %s' % (type(e), myexception.MyException, isinstance(e, myexception.MyException)))
    print('%s == %s: %s' % (type(e), MyException, isinstance(e, MyException)))
except myexception.MyException as e:
    print(traceback.format_exc())
    print('%s == %s: %s' % (type(e), myexception.MyException, isinstance(e, myexception.MyException)))
    print('%s == %s: %s' % (type(e), MyException, isinstance(e, MyException)))

输出

Traceback (most recent call last):
  File "/Users/admin/test/extest.py", line 19, in <module>
    raise_myexception()
  File "/Users/admin/test/extest.py", line 12, in raise_myexception
    raise myexception.MyException('ex.myexception.Myexception')
ex.myexception.MyException: ex.myexception.Myexception

<class 'ex.myexception.MyException'> == <class 'ex.myexception.MyException'>: true
<class 'ex.myexception.MyException'> == <class 'myexception.MyException'>: false
Traceback (most recent call last):
  File "/Users/admin/test/extest.py", line 31, in <module>
    raise_exception()
  File "/Users/admin/test/extest.py", line 15, in raise_exception
    raise MyException('myexception.Myexception')
myexception.MyException: myexception.Myexception

<class 'myexception.MyException'> == <class 'ex.myexception.MyException'>: false
<class 'myexception.MyException'> == <class 'myexception.MyException'>: true

可以看到,isinstance函数判断自定义类型是否相等也比较了引入路径。

猜你喜欢

转载自blog.csdn.net/chinesesexyman/article/details/131125044
今日推荐