2010-02-24 73 views
2

我想知道什麼是最優雅的方式來處理依賴於條件導入的異常。 例如:如何處理依賴條件導入的異常?

import ldap 
try: 
    ... 
    l = ldap.open(...) 
    l.simple_bind_s(...) 
    ... 
except ldap.INVALID_CREDENTIALS, e: 
    pass 
except ldap.SERVER_DOWN, e: 
    pass 

在真實的場景中(這使我想到這個的),我們有一個「登錄」頁面的CherryPy服務器。而登錄方法做了很多事情 - 其中之一是身份驗證。

但是,我可以使用LDAP以外的其他方法來進行身份驗證,在這種情況下,我根本不想導入ldap。

但是,如果我使'import ldap'語句有條件(例如,它只在配置文件中的USE_LDAP值爲True時才被導入),那麼我必須對'except'進行一些操作。問題是:什麼?

捕獲一個泛型異常,使用if語句來檢查我們是否使用LDAP(即,ldap被導入),然後使用isinstance來檢查Exception是否是正確的類型(ldap.INVALID_CREDENTIALS)?

嘗試將依賴於ldap的代碼集中在一個地方並重新引發用戶定義的異常,最終在登錄方法中被捕獲?

作爲最pythonic什麼你會建議?

回答

2

可能在某處應該有一個配置選項在您的程序中,用於決定應使用哪種身份驗證。進口應根據這個選項來完成。

如果你把所有的LDAP相關的認證功能集成到自己的模塊,如auth_ldap和驗證您的其他方法做同樣的,你可以做的登錄檢查這樣的:

if config.auth_method == 'ldap': 
    import ldap_auth as auth 
elif config.auth_method == 'db': 
    import db_auth as auth 
else: 
    raise Exception("No valid authentication module configured") 

auth.check_login(user, password) 

check_login方法在每個模塊中都會提供一個統一的接口,在內部執行任何必要的操作來執行特定的登錄。此功能還可以將特定的Ldap例外轉換爲通用的LoginFailure或僅返回TrueFalse,具體取決於用戶檢查是否成功。

+0

是的,這可能是最好的方法。謝謝。 – 2010-02-24 15:41:07

1

如果您爲authn(策略模式)編寫一組抽象模塊,這將更容易處理。每個模塊都會捕獲其特定的authn異常,並且可以引發應用程序定義的一般異常。