我想知道处理依赖于条件导入的异常的最优雅方法是什么。 例如:
import ldap
try:
...
l = ldap.open(...)
l.simple_bind_s(...)
...
except ldap.INVALID_CREDENTIALS, e:
pass
except ldap.SERVER_DOWN, e:
pass
在真实场景中(让我想到这一点的那个),我们有一个带有“登录”页面的樱桃服务器。登录方法有很多东西 - 其中之一就是身份验证。
但是,我可以使用除LDAP之外的其他内容来进行身份验证,在这种情况下我根本不想导入ldap。
但是如果我将'import ldap'语句设置为条件(例如,只有在配置文件中USE_LDAP值为True时才导入),我还必须对'except'进行操作。问题是:什么?
捕获一个通用的Exception,使用if语句来检查我们是否使用LDAP(即导入了ldap),然后使用isinstance来检查Exception是否是正确的类型(ldap.INVALID_CREDENTIALS)?
尝试将依赖于ldap的代码集中在一个地方并重新引发最终被登录方法捕获的用户定义的异常?
你认为最蟒蛇的是什么?
答案 0 :(得分: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
,或者只返回True
或False
,具体取决于用户检查是否成功。
答案 1 :(得分:1)
如果为authn(策略模式)编写一组抽象模块,这将更容易处理。每个模块将捕获其特定的authn异常,并在适当的位置引发应用程序定义的泛型异常。