簡體   English   中英

在python中定義異常類層次結構的正確方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM