Found misprint?

Select it with the mouse and hit Enter

Ctrl-Enter
Processed:
56 1 199 25
на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!

ЯМ:41001223475816

Редактор ресурсов Gettext для Android
The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!
We are glad to hear your questions, comments or suggestions!
(Open in new tab)
Users number: 762
Русская группа
на Google

Применение исключений на практике

Исключения

При написании приложения часто требуется получить какую-нибудь информацию из внешнего источника, например, адрес пользователя из его профайла, группу пользователя или что-нибудь из базы данных. Начинающие разработчики часто используют нечто подобное:

# Это неправильный код!
from django.contrib.auth.models import User, Group
from project.authuser.models import UserProfile
from project.po.models import RO

# Получение адреса пользователя из профайла
def get_address(request):
    profile = request.user.get_profile()
    address = ''
    if profile:
        address = profile.address
    return address

# Добавление пользователя в группу
SOME_GROUP_ID = 42
def join_user_to_group(request):
    group = Group.objects.get(id=SOME_GROUP_ID)
    if group:
        request.user.add(group)
        return True
    return False

# Получаем данные из базы
def get_records(request):
    org = RO.objects.get(id = request.user.get_profile().org.id)
    if org:
        return org
    return None

Выглядит всё это очень ужасно, даже если закрыть глаза на явные ошибки.

Попробуем переписать это всё с использованием обработки исключений:

from django.contrib.auth.models import User, Group
from project.authuser.models import UserProfile
from project.po.models import RO

# Получение адреса пользователя из профайла
def get_address(request):
    try:
        return request.user.get_profile().address
    except UserProfile.DoesNotExist:
        return 'Профайл отсутствует'

# Добавление пользователя в группу
SOME_GROUP_ID = 42
def join_user_to_group(request):
    try:
        group = Group.objects.get(id=SOME_GROUP_ID)
        request.user.add(group)
        return True
    except Group.DoesNotExist:
        return False

# Получаем данные из базы
def get_records(request):
    try:
        return RO.objects.get(id = request.user.get_profile().org.id)
    except UserProfile.DoesNotExist:
        print 'Профайл отсутствует'
        return None
    except RO.DoesNotExist:
        print 'Нет данных'
        return None

По-моему, так будет лучше.