簡體   English   中英

如何從包__init__中引發自定義異常?

[英]How do I raise a custom exception from a package __init__?

我有一個包__init__.py看起來像這樣:

import sys

__required_python_version = (2,6, 0)

if sys.version_info < __required_python_version:
    this_version = '.'.join([str(x) for x in sys.version_info[0:3]])
    required_version = '.'.join([str(x) for x in __required_python_version])
    raise PythonVersionError(this_version, required_version)

class PythonVersionError(Exception):
    def __init__(self, this_version, required_version):
        self.this_version = this_version
        self.required_version = required_version

    def __str__(self):
        return 'Python version %s is invalid.  Must be at least %s' % (self.this_ver, self.required_ver)

雖然我確信有一種更優雅的方式來格式化這些版本字符串,我可能會通過使用標准異常,我真正的問題是我將如何做這樣的事情? 最好的方法是將我的自定義異常移動到單獨的文件中並導入它嗎? 或者我應該在運行__init__時執行的函數中包裝版本檢查嗎? 我只是在尋找有關首選方法的建議。

謝謝

因為看起來你沒有任何用戶可以使用該異常 - 除非你的其他模塊使用這個模塊作為更大系統的一部分,我說你不需要這里的自定義異常。

除了給出的錯誤信息之外,從中獲得的收益很少。 試圖導入你的Ay模塊必須要注意它,捕獲異常,或者只是讓程序停止回溯。 因為要知道它,它需要導入你的模塊,它只會崩潰到一個回溯 - 然后用戶可以讀取錯誤消息。

對於一個讀取錯誤消息的人來說,一個簡單的“Exception”表明它是不正確的PythonVersin和任何自定義異常一樣好。

在技​​術方面,Python需要在提升之前了解PythonVersionError :在嘗試在if塊中提升之前,需要先放置該代碼。

最后,如果您正在構建一個更大的系統,並且系統的其他部分可能會嘗試捕獲PythonVersionError ,那么coorect事情就是將它放在自己的文件/模塊中,以便它可用於此模塊它,以及導入它的任何其他模塊。

這里似乎有些尷尬。

當它不會在其他模塊中的任何其他地方重用時,創建自定義Exception類真的很有用嗎? 如果每個人都這樣做,我們最終會得到每個模塊定義它自己的不同(可能是不兼容的)PythonVersionError類。

為什么不使用標准的現有例外? 對於這個,我可能會選擇標准的RuntimeError異常。

好的,我知道你不想要這個答案,但無論如何。

如果我真的想這樣做,至少我會將PythonVersionException類定義為檢查代碼的本地實例,以避免污染模塊命名空間或模塊其他文件的任何全局命名空間。

暫無
暫無

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

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