Форум сайта python.su
0
Чем обусловленна необходимось импортирования кастомных исключений в пространство имен, где осуществляется их обработка?
пример:
exc.py
class IncorrectArg(Exception): def __str__(self): return "Error message", arrs
from exc import IncorrectArg #Без этого, конечно, экземпляр исключения не создать. class foo(object): def __init__(self, arg1, arg2): if condition: raise IncorrectArg(arg1, arg2) else: do something
from lib import foo from exc import IncorrectArg """По идее, интерпритатор можен вытолкнуть созданный объект исключения и присвоить его переменной err.""" try: myObj = foo(arg1, arg2) except IncorrectArg as err: print(err)
Отредактировано missterr (Июнь 21, 2012 16:29:40)
Офлайн
> Чем обусловленна необходимось импортирования кастомных исключений в пространство имен, где осуществляется их обработка?
Тем, что вы используете имя исключения, и интерпретатору надо знать, что это за имя. Любое имя в программе должно быть объявлено в текущем модуле: явно или с помощью импортирования.
За исключением встроенных функций и имён базовых типов.
Отредактировано lorien (Июнь 21, 2012 17:34:04)
Офлайн
52
Разумеется, можно наваять много магии, чтобы сэкономить несколько строк кода, но:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
…
Отредактировано fata1ex (Июнь 21, 2012 17:40:14)
Офлайн
0
Тем, что вы используете имя исключения, и интерпретатору надо знать, что это за имя. Любое имя в программе должно быть объявлено в текущем модуле: явно или с помощью импортирования.Неубедительно. Как это работает - очевидно, неочевидно с какой целью, весь смысл исключений во “всплывании” его из глубин, так сказать)
Explicit is better than implicit.С этой точки зрения логично.
try: myObj = foo(arg1, arg2) except Exception as err: print(err)
Офлайн
52
missterr, внутренние исключения в библиотеке можно обрабатывать самостоятельно внутри, а пользователю выкидывать стандартные, вроде ValueError или TypeError. Если совсем специфичная вещь, для которой обязательно нужно своё исключение, пользователям будет несложно написать пару импортов. Как например: from django.http import Http404.
Офлайн
0
fata1ex, а если в моем коде действительно произойдет ValueError или TypeError, пользователь библиотеки обработает и выведет конечному пользователю, мол “Что-то ты делаешь не правильно дружок”… ошибка похоронена. Лучше уж заставить импортировать.
Да,
from django.http import Http404
Офлайн
52
missterr, ну это аргумент из серии “если вдруг я ошибусь и всё испорчу” :) В нормальном оттестированном коде вероятность, что в том месте, где вы выкидываете исключение, которое ждёт пользователь библиотеки, действительно произойдёт это же самоё исключение, которого вовсе не ждёт пользователь библиотеки, куда ниже, чем вероятность, что просто что-нибудь пойдёт не так и сломается. Вот такое длинное предложение.
Офлайн
> 2. Либо заставлять пользователя везде импортировать кучу хлама…
Он будет импортировать классы исключений тоолько в том. случае, если будет хотеть их обрабатывать. Если пользователю нужно просто поймать любые исключения, он воспользуется except Exception конструкцией.
Кроме того, обычно все исключения библиотеки наследуются от какого-то общего исключения библиотеки, так чтобы пользователь мог ловить их с помощью одного класса. Например, у меня в Grab есть GrabError, а от него наследуются GrabNetworkError, GrabTimeoutError и т.д.
Офлайн
0
lorien, весьма показательный и авторитетный пример, благодарю.
Офлайн