【发布时间】:2015-09-04 08:57:27
【问题描述】:
我有一个异常实例,需要根据它的类型执行代码。哪种方式更清楚 - 重新引发异常或 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
实例检查:
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)
PS。代码用于 django process_exception 中间件,因此在重新引发异常时,我应该为所有未知异常写except:pass。
【问题讨论】:
-
你没有再加注。您正在使用特定于异常的处理程序。您认为哪个更易读且使用更少的缩进级别?
-
另外,不要使用
except: pass;你只是让MemoryError或KeyboardInterrupt静音。最多使用except Exception:,除非你有很好的理由(通常是再加注)。 -
您的异常首先来自哪里?难道你不能
try...except异常的来源而不是在变量中捕获它吗? -
这主要是见仁见智。根据上下文,两者都可能更清楚。当我捕获异常时,我认为在异常行中进行检查更具可读性(捕获所有然后使用 if 语句会导致更复杂、更多缩进和不太清晰的代码恕我直言)。
-
如果你有这么多的选择来解决问题,那么有问题的代码做的太多了,IMO。
标签: python try-except isinstance