Найти - Пользователи
Полная версия: Использование try except
Начало » Django » Использование try except
1 2
fobiasmog
Всем привет!
Мне очень часто нужно в GET параметрах передавать числовые значения. В связи с этим вопрос: как лучше всего проверить число мне пришло или нет.

Пока что использую конструкцию:
try:
    int(x)
except:
    return None

Второй вопрос: использование try-except это хорошая практика?
FishHook
Зачем?
request.GET['name']

выдаст Вам KeyError без лишних усилиий
Singularity
def toint(n,default=0):
    try:
        return int(n)
    except ValueError:
        return default

Обновил как-бы
fobiasmog
FishHook
Singularity
Спасибо, а что на счёт второго вопроса?
FishHook
fobiasmog
Спасибо, а что на счёт второго вопроса?
Вы должны понимать, для чего Вы что-то делаете. Естественно, перехват исключений и их обработка - это нормальная практика,
но Вы меня простите, я не понимаю чем это Ваш код
except:
    return None
может быть полезен в веб-программировании. Какой смысл то?
Вы хотите вместо response вернуть None или кому этот None Вы пытаетесь отдать и в какое место?
Lexander
FishHook
я не понимаю чем это Ваш код…
может быть полезен в веб-программировании. Какой смысл то?
Зависит же от задачи.
Бывают задачи,в которых можно использовать дефолтные значения, а бывают, что нельзя.
Причем, второе очень часто встречается в финансовой сфере.
fobiasmog
Второй вопрос: использование try-except это хорошая практика?
Для проверок значений - нет.
Эта конструкция очень затратна. Поэтому лучше использовать явные проверки, даже если их несколько.
Singularity
Lexander
явные это как ? у нас же строка на входе
JOHN_16
Singularity
Lexander явные это как ? у нас же строка на входе
'123'.isdigit()
?
Lexander
Singularity
явные это как ?
Явные - это прямым вызовом проверяющих функций и сравнений.
пример выше написал JOHN_16

Чувствую, надо бы дать расширенное пояснение.
Сами по себе try-except, конечно, не есть зло.
Но нужно аккуратно с ними обращаться и понимать суть происходящего.
К тому же не всякая попытка преобразования выдаст исключение.
Например, float('nan') исключения не выдаст. А еще сюда можно написать определенные символы Юникода, которые исключения не вызовут тоже.

Когда исключения нельзя использовать?
Во время обучения (когда еще нет понимания что происходит внутри) и для простых проверок.
Судя по сообщению автора топика, этот как раз наш случай.

Появляется ли смысл использовать try-except когда проверок становится много или они становятся сложными? Все еще нет. Теперь самое время обратить внимание на модули валидации, коих полно в интернете.
Внутри этих модулей почти наверняка будут использоваться try-except.
Дело в другом - это еще не тот случай, когда пора писать свой велосипед.
Поэтому лучше использовать готовое решение.

И только тогда, когда вы вышли за пределы возможностей используемого модуля валидации данных, его можно расширить и в своем коде использовать try-except как минимум для унификации обработки таких ситуаций. Т.е. есть польза в долгосрочной перспективе в процессе поддержки проекта.
Lexander
Кстати, ближе к примеру автора:
int(1.23) исключения тоже не выдаст, вернет 1.
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