Python 确定异常类型的最佳方法

Python 确定异常类型的最佳方法,python,try-except,isinstance,Python,Try Except,Isinstance,我有一个异常实例,需要根据其类型执行代码。哪种方式更清楚-重新引发异常或isinstance检查 重新提出: try: raise exception except OperationError as err: result = do_something1(err) except (InvalidValue, InvalidContext) as err: result = do_something2(err) except AnotherException as err

我有一个异常实例,需要根据其类型执行代码。哪种方式更清楚-重新引发异常或isinstance检查

重新提出:

try:
    raise exception
except OperationError as err:
    result = do_something1(err)
except (InvalidValue, InvalidContext) as err:
    result = do_something2(err)
except AnotherException as err:
    result = do_something3(err)
except:
    pass
i持续检查:

if isinstance(exception, OperationError):
    result = do_something1(err)
elif isinstance(exception, (InvalidValue, InvalidContext)):
    result = do_something2(err)
elif isinstance(exception, AnotherException):
    result = do_something3(err)

django process_异常中间件中使用了PS.Code,因此当重新引发异常时,我应该为所有未知异常编写except:pass

您可以将要处理的异常作为键存储在字典中,并将不同的函数作为它们的值。然后,您可以捕获除之外的一个
中的所有错误,并调用字典以确保相关函数已运行

error_handler = {
                  OperationError: do_something1,
                  InvalidValue: do_something2,
                  InvalidContext: do_something2,
                  AnotherException: do_something3,
                }

try:
    #raise your exception
except (OperationError, InvalidValue, InvalidContext, AnotherException) as err:
    result = error_handler[type(err)]()
我怀疑可能有一种方法可以通过编程方式将
错误处理程序.keys()
传递到
,但我在Python2.7中尝试的方法到目前为止还不起作用


请注意,正如martineau指出的,因为它使用
type(err)
作为字典键,所以它不会像
isinstance(err,…)
except(err)
那样处理派生的异常类。您需要匹配精确的异常。

首先去掉
except:pass
子句-一个人应该永远不会默默地传递异常,特别是在一个裸
except
子句中(无论如何都不应该使用裸
except
子句)

也就是说,“最佳”方法实际上取决于具体的用例。在上面的示例中,对于不同的异常/异常集,显然有不同的处理程序,因此显而易见的解决方案是第一个。有时,您确实有一些对所有或大多数处理程序通用的代码,以及一些特定于一个异常或异常子集的代码,然后您可能希望对特定部分使用
isinstance
,即:

try:
   something_that_may_fail()
except (SomeException, SomeOtherException, YetAnotherOne) as e:
   do_something_anyway(e)
   if isinstance(e, YetAnotherOne):
      do_something_specific_to(e)

现在,正如mkrieger所评论的,有三个或更多的异常需要处理可能是代码或设计的味道-try块中的部分可能做了太多的事情-但是有时候你没有太多的选择(调用一个内置或第三部分函数,它可能以许多不同的方式失败…。

你不是在提出问题。您正在使用特定于异常的处理程序。你认为什么更具可读性并且使用更少的缩进级别?另外,不要使用
,除了:pass
;您刚刚关闭了
内存错误
键盘中断
。最多使用
,例外情况除外:
,除非你有很好的理由(通常是重新提出)。你的例外情况首先来自哪里?你不能试试吗<代码>除了
异常的来源,而不是在变量中捕获它?这主要是一个意见问题。根据上下文的不同,两者可能更清晰。当我捕获一个异常时,我认为在except行中进行检查更具可读性(捕获all,然后使用if语句将导致更复杂、更缩进和更不清晰的代码IMHO)。如果您有这么多的选项来解决问题,那么问题代码做得太多了,IMO。感谢您的想法,但是我写了函数
做一些事情1,2,3
,只是举个例子。在我的例子中,可能有随机代码块。我认为可能是这样的,但是我仍然认为可以考虑在这里运行函数,因为除非有范围问题或者必须传递各种不同的参数,否则没有太多的缺点。