Как обрабатывать исключения, зависящие от условного импорта? - PullRequest
2 голосов
/ 24 февраля 2010

Мне интересно, каков самый элегантный способ обработки исключений, которые зависят от условного импорта. Например:

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 в файле конфигурации), я тоже должен что-то делать с исключением, кроме. Вопрос в том, что?

Перехватите универсальное исключение, используйте оператор if, чтобы проверить, используем ли мы LDAP (т. Е. Импортируем ldap), а затем используем isinstance, чтобы проверить, является ли исключение правильным типом (ldap.INVALID_CREDENTIALS)?

Попытаться сконцентрировать код, который зависит от ldap, в одном месте и повторно вызвать пользовательское исключение, которое, наконец, попадет в метод входа в систему?

Что бы вы назвали самым питоническим?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Возможно, где-то в вашей программе должен быть параметр конфигурации, который используется для определения типа аутентификации. Импорт должен быть выполнен в зависимости от этой опции.

Если вы поместите все связанные с 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 голос
/ 24 февраля 2010

Это будет проще, если вы напишите набор модулей абстракции для authn (Strategy Pattern). Каждый модуль будет перехватывать свои особые исключения authn и создавать общие исключения, определенные приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...