簡體   English   中英

Python異常的最佳實踐?

[英]Best Practices for Python Exceptions?

創建例外的最佳做法是什么? 我剛看到這個,我不知道我是否應該感到恐懼或喜歡它。 我在書中多次閱讀異常永遠不會持有字符串,因為字符串本身可以拋出異常。 這有什么真相嗎?

基本上我從腳本的理解是這樣做,所以所有內部Python庫將有一個共同的錯誤消息格式(迫切需要的東西)所以我可以理解為什么把錯誤消息字符串是一個好主意。 (幾乎每種方法都會拋出異常,因為完全不需要無效的通過)。

有問題的代碼如下:

"""
Base Exception, Error
"""
class Error(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return "[ERROR] %s\n" % str(self.message)

    def log(self):
        ret = "%s" % str(self.message)
        if(hasattr(self, "reason")):
            return "".join([ret, "\n==> %s" % str(self.reason)])
        return ret

class PCSException(Error):
    def __init__(self, message, reason = None):
        self.message = message
        self.reason = reason
    def __str__(self):
        ret = "[PCS_ERROR] %s\n" % str(self.message)
        if(self.reason != None):
            ret += "[REASON] %s\n" % str(self.reason)
        return ret

這只是冰山一角,但有人可以給我一些洞察力,這是一個什么使這個可怕的想法? 或者,如果有一個更好的異常編碼過程/風格。

強大的異常處理(在Python中) - 我之前寫過的“Python異常的最佳實踐”博客文章。 你可能會發現它很有用。

博客的一些關鍵點:

永遠不要使用流量控制的例外

異常情況存在例外情況:不屬於正常執行的事件。

如果找不到模式,請考慮返回-1的字符串'find',但索引超出字符串結尾會引發異常。 找不到字符串是正常執行。

處理知道如何處理它們的級別的異常

...

最好的地方是可以處理異常的那段代碼。 對於某些異常,例如編程錯誤(例如IndexError,TypeError,NameError等),異常最好留給程序員/用戶,因為“處理”它們只會隱藏真正的錯誤。

總是問“這是處理這個例外的正確位置嗎?” 並注意捕捉所有異常。

記錄代碼拋出的異常

...

考慮代碼可能引發的異常將幫助您編寫更好,更安全和更封裝的代碼

我在書中多次閱讀異常永遠不會持有字符串,因為字符串本身可以拋出異常。 這有什么真相嗎?

什么?

請提供參考或鏈接。 這完全是不真實的。

由於所有對象都可以拋出異常,因此該邏輯不會在異常中包含任何對象。

不,“沒有字符串”在Python上下文中簡直就是瘋了。 也許您是在C ++上下文中閱讀它。


編輯

曾幾何時(回到過去),您可以通過名稱而不是實際的類來引發Python異常。

raise "SomeNameOfAnExceptionClass"

這是不好的。 但這包括異常中的字符串。 這是使用字符串而不是實際的類對象來命名異常。 在2.5中,這仍然有效,但會收到棄用警告。

也許這就是你讀到的“不要用字符串名稱引發異常”

我相信反對使用字符串創建異常的建議來自“學習Python”(O'Reilly)。 在標題為String Exceptions Are Right Out的部分中! ,它指出了(現已刪除)使用任意字符串直接創建異常的能力。

它給出的代碼是一個例子:

myexc = "My exception string"
try:
    raise myexc
except myexc:
    print ('caught')

這是第四版的p858(平裝本)。

第一印象是異常的代碼太多了。

格式化異常應在記錄器配置中完成。 記錄本身也是如此。

它還重新定義了標准(和已棄用)消息屬性,並且不調用超類構造函數。 (這可能會或可能不會破壞Python 3.0異常鏈接,我沒有嘗試過,因為我正在運行2.6)

使用BaseException.args可以實現額外代碼的大部分功能,將以下內容記錄為“消息”:

'\n==> '.join(exception.args)

我認為,如果可以使用通用/慣用機制來完成某些事情,那么在異常處理中尤其應該這樣做。 (例外是應用程序層發出信號的機制。)

就個人而言,我盡量避免任何事情

class SomeException(Exception): pass

(免責聲明:主觀回答,可能是問題的性質。)

class Error(Exception):
    """Base class for other exceptions"""
    pass

class empty_string_error(Error):
    """Raised when the input value is too large"""
    pass
while(1):
    try:
        if("Your Condition"):
            raise empty_string_error
        else:
            print("OUTPUT")
    except empty_string_error:
        print("APT MESSAGE")
        print(" ")
    finally:
        pint("Mandatory code")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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