异常处理:区分Python

时间:2017-12-04 16:39:04

标签: python python-3.x exception error-handling exception-handling

根据导致异常的原因的差异,分别处理相同类型的异常的推荐方法是什么?

让我们说要以不同方式处理以下两个AttributeError实例:

  • 'str' object has no attribute 'append'
  • 'float' object has no attribute 'append'

同时,我们不想处理其他属性错误。

是否有适用于所有异常类型的通用答案?我可以使用异常对象上的某些方法或函数来查询异常对象的详细信息吗?

Try:
    blah
Except AttributeError as exc:
    if exc.baz('foo') is bar:
         handle 'str' object has no attribute 'append'
    elif plugh(exc):
         handle 'float' object has no attribute 'append'
    else:
         raise exc

我认为显而易见的答案是重构。我的问题特别关注那些效率低下或根本不可能的情况(如果有任何此类情况)。

1 个答案:

答案 0 :(得分:1)

您可以使用dir来查看对象的方法和属性。

在Python 3.6中,来自:

a = 'hello'
try:
    a.append(2)
except AttributeError as e:
    print(dir(e))

你得到:

['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'with_traceback']

这缩小了我们可以测试的内容,因为我们不需要dunder,只留下argswith_traceback。那么你可能得到的最好的就是使用args来返回元组中的字符串:

a = 'hello'
try:
    a.append(2)
except AttributeError as e:
    if 'str' in e.args[0]:
        print('Need to handle string')
    elif 'float' in e.args[0]:
        print('Need to handle float')