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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值