2011-03-08 33 views
3

我有一個包__init__.py看起來是這樣的:如何從包__init__中引發自定義異常?

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__時執行的函數中?我只是在尋找關於首選方法的建議。

謝謝

+0

糟糕,圍繞init的我的下劃線變成了標記。我想我需要學習如何在這裏轉義角色。 – zenzic 2011-03-08 15:07:07

+0

突出顯示要編碼的文本,然後按工具欄上的「編碼」按鈕。它將用空行包圍它並縮進4個空格。你也想在'內聯代碼'周圍使用反引號。請參閱:http://stackoverflow.com/editing-help – chmullig 2011-03-08 15:08:04

+0

在編寫代碼時使用代碼標記以防止發生這種情況 – cmaynard 2011-03-08 15:09:11

回答

2

這裏似乎有些尷尬。

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

爲什麼不使用標準的現有異常?對於這一個我可能會去一個標準的RuntimeError異常。

OK,我知道你不希望這個答案,但無論如何。

如果我真的想做到這一點,至少我會定義PythonVersionException類爲校驗碼,以避免污染模塊命名空間或模塊的其他文件的任何全局命名空間的本地實例。

+0

我同意,這就是我最終做的,儘管我沒有找到一個我認爲非常合適的標準異常類。但正如我在原帖中所說的那樣,這給我留下了上述的問題,即如果真的需要這樣的話,我會怎麼做。 – zenzic 2011-03-08 15:21:32

+0

@zenzic:我完成了我的回答。這就是我會這樣做的方式。 – kriss 2011-03-08 15:23:44

3

由於看起來你不會有任何用戶的例外 - 除非這個模塊是由其他模塊使用,你正在實施作爲一個更大的系統的一部分,我說你不需要一個自定義在這裏例外。

很少有從它給出的錯誤信息獲得,除了。嘗試導入你的模塊必須意識到這一點,才能捕捉到異常情況,或者讓程序停止回溯。既然知道它,它將需要導入你的模塊,它只會崩潰到回溯 - 無論如何,用戶可以閱讀錯誤信息。

對於一個讀錯誤信息,一個普通的「異常」的,並稱這是不正確的PythonVersin是任何自定義異常的好。

在技術方面,Python在提高它之前需要知道PythonVersionError:在您嘗試在if塊內引發該代碼之前,您需要先將該代碼放入。

最後,如果你建立一個更大的系統,以及該系統的其他部分可能試圖抓住PythonVersionError,該coorect要做的是把它自己的文件/模塊中,使之成爲可用到這個將引發它的模塊,以及任何其他正在導入它的模塊。

相關問題