[英]Proper way of defining exception class hierarchy in python?
我希望能夠引發類似內置異常的異常,您既可以傳遞消息,也可以引發類名(隱式創建的實例)。 像這樣
raise IndexError
raise IndexError('Something went wrong, bro')
我的以下代碼正確嗎?
最初我在考慮這個:
class SomeError(Exception):
def __init__(self, *args):
if args:
print ' '.join(args)
class SomeCriticalError(SomeError):
def __init__(self, *args):
super(SomeCriticalError,self).__init__(*args)
print 'This is a critical error, process stopped ...'
sys.exit(1)
class SomeCookiesError(SomeCriticalError):
def __init__(self, *args):
print 'Firefox cookies retrieving failed ..'
super(SomeCookiesError,self).__init__(*args)
但是在這種情況下,我必須為CmiCriticalError的每個子類定義__init__()
,我覺得一定有問題(在每個子類中調用super()
似乎很尷尬),然后我嘗試了
class SomeError(Exception):
def __init__(self, *args):
if args:
print ' '.join(args)
else:
print self
class SomeCriticalError(SomeError):
def __init__(self, *args):
super(SomeCriticalError,self).__init__(*args)
print 'This is a critical error, process stopped ...'
sys.exit(1)
class SomeCookiesError(SomeCriticalError):
def __str__(self):
return 'Firefox cookies retrieving failed ..'
但這仍然令人感到尷尬,我想念什么?
基本上我想要做的是在異常實例本身處理異常,如sys.exit()
在SomeCriticalError
,而且由於我主要的代碼,我可以提高SomeCookiesError
在多個地方,我不希望傳遞了同樣的信息每次都使用字符串參數,那么我可以做什么內置的異常嗎? (未傳遞任何參數時,顯示默認消息)
通常, Exception
子類不負責處理導致其引發的問題。 這取決於錯誤處理代碼(例如,包裹在引發異常的地方的try
/ catch
語句)。 異常類型應該將自身限制為呈現優美的消息並封裝任何適當的數據。
因此,在您的示例中,您應該簡單地通過不捕獲(或僅在退出之前在最高級別捕獲它們)來處理“嚴重”錯誤。 許多異常類可能很簡單:
class SomeCriticalError(Exception):
pass
其他一些異常類可能會做更多的事情,但是它們應該專注於記錄情況的適當細節,而不是如何解決:
class CookieError(Exception):
def __init__(self, cookie_name):
super(CookiesError, self).__init__("Could not find Firefox cookie {!r}"
.format(cookie_name)) # custom message
如果要調試CookieError
時需要一些額外的數據,則可以讓異常類將其保存到self.data
或其他任何東西中(盡管如果要使raise CookieError
語法起作用,則需要使__init__
方法的所有參數都是可選的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.