2011-08-16 59 views
1

這裏是我的問題的描述:Python - 引發異常嗎?

我有任務採取了一堆表名,並把前綴在他們面前,就像這樣:

PREFIX = 'foo_'; 

prefixed_tablename = "".join([PREFIX, tablename[:27]]) 

(表名不能超過30個字符(一些Oracle DB限制),這就是爲什麼我只拿到前27個字符)。

現在,有時候這可能會導致表名重複(如果只有表名的最後3個字符不同)。

我可以實現一些奇特的算法來創建獨特的表名,但目前檢測重複名稱就足夠了。所以我考慮將它們存儲在一個集合中,並且如果創建一個前綴表名,請檢查該集以查看這樣的表名是否已經存在。

現在,對於真正問題:

如果重複檢測得到,我需要停止我的腳本執行,顯示了某種錯誤。在Java中,我只會引發異常,但我不知道這是否是Python中的首選方式。

我應該引發異常,還是隻打印出消息並退出?

+1

如果你用''「.join([PREFIX,tablename])[:30]''也更好。這樣,如果你改變前綴的長度(除了@agf指出的31個字符的情況),它仍然可以工作。 – JasonFruit

+3

也可能更好地做'name_limit = 30'然後'「」.join([PREFIX,tablename])[:name_limit]'所以後代不會懷疑30的意思,特別是如果你遷移到不同的數據庫後端沒有這個限制 –

+0

@Alexander或只是適當地記錄它。 – agf

回答

4

27 + 4 = 31.

爲什麼不使用異常?如果你以後不想退出,而是在外部範圍內捕捉異常並對其進行處理,那麼與使用sys.exit時相比,你的改變就會減少。

2

Python中的異常實際上比Java中的使用更爲寬鬆(例如,迭代器在內部使用它們來指示迭代何時停止)。如果這真的是一個「例外」情況 - 也就是說,如果這不會經常發生 - 理所當然 - 那麼這是提出例外的完美情況。

1

我會說你應該提出一個例外。如果使用消息構造異常,那麼腳本將隨所需消息一起退出,如果您想更改處理錯誤的方式,則可能會更容易引發異常。另外,如果您曾將此代碼用作較大程序的一部分,則可以決定如何在較大程序中單獨處理錯誤。