Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 25, 2009 02:23:37

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Exceptions

Доброго времени суток. Может быть кто подскажет. Вопрос по поводу исключений. В питоне моей головной болью стало то что я не могу понять или как-то узнать какие исключения может так или иначе выкинуть функция. Приведу простой пример имеется функция os.path.exists которая по доке возвращает или True или False и никакое исключение выбрасывать вроде не должно. Передал параметр None на что получил исключение TypeError. Данное исключение не обрабатывалось, соответственно и вся прога вылетела с Tracebackom. Кто-нибудь может посоветовать как действовать в таких ситуациях? Или может я чего-то не догоняю и про TypeError писать и не надо было ввиду его очевидности. Но где гарантии что в этой же функции не вылетит ещё какое-нибудь исключение? Ловить все Exception не вариант..



Офлайн

#2 Окт. 25, 2009 10:05:23

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Exceptions

ну, в данном случае с TypeError это, по-моему, очевидно. Естественно, функция ожидает либо str либо unicode объект, и при указании числа, скажем, или того же None будет TypeError. Еще пример:

>>> abs(-1)
1
>>> abs('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'
>>>
Функция abs возвращает модуль (абсолютное значение) числа, вы ж не будете туда передавать строку и ожидать что функция что-то вернет правильно?

Если есть затруднения с определением типа аргумента, который вы будете передавать в функцию пользуйтесь, скажем assert:
>>> ...
>>> path = None
>>> assert type(path) == type('') or type(path) == type(u'')
>>> os.path.exists(path)
>>> False
>>> ...
Очень помогает в дебаге кода, так как вы заранее указываете интерпретатору, что значение path обязательно должно быть строкой поскольку на этапе тестирования вам обязательно, если такое случится выпрыгнет AssertionError, и вы сможете узнать откуда взялся этот неверный аргумент.



Отредактировано (Окт. 25, 2009 13:35:58)

Офлайн

#3 Окт. 25, 2009 11:11:42

mem
От:
Зарегистрирован: 2009-10-25
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Exceptions

Получается при правильном использовании данной функции она НИКОГДА не выкинет исключения что и описано в доке. Тогда всё складывается на свои места. Cпасибо вам!



Офлайн

#4 Окт. 25, 2009 13:07:11

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Exceptions

regall

assert isinstance(path, basestring)
раз на то пошло)

Офлайн

#5 Окт. 25, 2009 13:39:01

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Exceptions

slav0nic
assert isinstance(path, basestring)
Согласен, но для начала человеку моя запись будет более понятна, кроме того раскрывает то, что юникод и строка в Python 2.х - разные типы данных, я лично однажды застопорился на этом =), пусть это не станет проблемой для других ).



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version