即使 error_code 不相关,AppleError 仍然是 AppleError 而不是 BananaError,因此陷入 BananaError 是没有意义的。
您可以改为为不同的错误代码定义特定的错误:
GRANNY_SMITH_ERROR = 1
MACINTOSH_ERROR = 2
class AppleError(Exception):
def __init__(self, error_code, *args):
super(AppleError, self).__init__(*args)
self.error_code = error_code
class GrannySmithError(AppleError):
def __init__(self, *args):
super(GrannySmithError, self).__init__(GRANNY_SMITH_ERROR, *args)
class MacintoshError(AppleError):
def __init__(self, *args):
super(MacintoshError, self).__init__(MACINTOSH_ERROR, *args)
那你可以尝试匹配具体的错误:
try: raise MacintoshError()
except MacintoshError as exc: print("mac")
except GrannySmithError as exc: print("granny smith")
如果你不关心区分不同类型的苹果错误,你仍然可以捕获所有苹果错误:
try: raise MacintoshError()
except AppleError as exc: print("generic apple")
您可以结合这些,例如,只为 GrannySmith 做特殊处理,而不是为 Macintosh:
try: raise MacintoshError()
except GrannySmithError as exc: print("granny smith")
except AppleError as exc: print("generic apple")
重要的是从最具体到最不具体列出错误。如果在 GrannySmithError 之前测试 AppleError,那么它永远不会进入 GrannySmith 块。