背景
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
函数判断自定义类型是否相等也比较了引入路径。