При написании приложения часто требуется получить какую-нибудь информацию из внешнего источника, например, адрес пользователя из его профайла, группу пользователя или что-нибудь из базы данных. Начинающие разработчики часто используют нечто подобное:
# Это неправильный код!
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
По-моему, так будет лучше.