Найти - Пользователи
Полная версия: Exceptions
Начало » Python для новичков » Exceptions
1
mem
Доброго времени суток. Может быть кто подскажет. Вопрос по поводу исключений. В питоне моей головной болью стало то что я не могу понять или как-то узнать какие исключения может так или иначе выкинуть функция. Приведу простой пример имеется функция os.path.exists которая по доке возвращает или True или False и никакое исключение выбрасывать вроде не должно. Передал параметр None на что получил исключение TypeError. Данное исключение не обрабатывалось, соответственно и вся прога вылетела с Tracebackom. Кто-нибудь может посоветовать как действовать в таких ситуациях? Или может я чего-то не догоняю и про TypeError писать и не надо было ввиду его очевидности. Но где гарантии что в этой же функции не вылетит ещё какое-нибудь исключение? Ловить все Exception не вариант..
regall
ну, в данном случае с 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, и вы сможете узнать откуда взялся этот неверный аргумент.
mem
Получается при правильном использовании данной функции она НИКОГДА не выкинет исключения что и описано в доке. Тогда всё складывается на свои места. Cпасибо вам!
slav0nic
regall
assert isinstance(path, basestring)
раз на то пошло)
regall
slav0nic
assert isinstance(path, basestring)
Согласен, но для начала человеку моя запись будет более понятна, кроме того раскрывает то, что юникод и строка в Python 2.х - разные типы данных, я лично однажды застопорился на этом =), пусть это не станет проблемой для других ).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB