Правильное исключение для вызова, если в качестве аргумента указано None - PullRequest
22 голосов
/ 28 ноября 2011

Что такое «правильный» класс исключений, который нужно вызывать, когда одна из моих функций обнаруживает, что None передано там, где требуется значение аргумента?Например:

 def MyFunction(MyArg1, MyArg2):

     if not MyArg2:
          raise ?Error?

Я думаю, я видел TypeError, использованный здесь (и это правда, что я получаю NoneType там, где ожидается какой-то другой тип), но это меня не поражаеткак вполне подходящий для этой ситуации, где я думаю, что Исключение может быть более явным.

Ответы [ 4 ]

38 голосов
/ 28 ноября 2011

В Python нет встроенного исключения "неверный аргумент" или "нулевой указатель".Вместо этого большинство функций вызывает TypeError (недопустимый тип, такой как NoneType) или ValueError (правильный тип, но значение находится за пределами принятого домена).

Если вашей функции требуется объектопределенный класс и получает None вместо этого, он, вероятно, должен поднять TypeError, как вы указали.В этом случае вам следует явно проверить None, поскольку объект правильного типа может вычислять как логический False, если он реализует __nonzero__ / __bool__:

if MyArg2 is None:
    raise TypeError

Документы Python :

2 голосов
/ 28 ноября 2011

Как уже отмечали другие, TypeError или ValueError были бы естественными.Если это не кажется достаточно конкретным, вы можете создать подкласс для любого из этих двух исключений.Это позволяет согласованно обрабатывать недопустимые аргументы для широкого класса функций, а также дает вам больше деталей для конкретной функции.

2 голосов
/ 28 ноября 2011

Большая часть функции python вызывает TypeError, если None передается в качестве аргумента. Возьмите любую функцию, скажем chr(None), и посмотрите, как она поднимает TypeError.

0 голосов
/ 28 ноября 2011

Просто используйте assert:

assert type(MyArg2) == int

Или в качестве альтернативы:

assert type(MyArg2) != None

Это предотвратит передачу кем-то неверного типа, а также решением проблемы None.Он вернет AssertionError, согласно документации.

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