помогите пожалуйста разобраться в вопросе написания устойчивого к ошибкам кода
вот простейший наглядный случай. есть система лайков. пользователь жмёт на иконку лайка и счётчик увеличивается на единицу или уменьшается на единицу(если пользователь нажимает ещё раз)
процесс можно описать так:
def ajax_like(request):
"""
ajax check auth for like process and change procedure like data
action - value for ajax refresh counter on page
is_authenticated - flag authentication, transmitted to js-script for output modal
"""
is_authenticated = False
action = 0
video_id = request.POST.get('video_id', '')
if request.method == 'POST' and request.is_ajax():
if request.user.is_authenticated():
is_authenticated = True
like_exists = Like.objects.filter(video_id=video_id, user=request.user.pk).exists()
if like_exists:
# minus. delete record. decrement for like table
Like.objects.filter(video_id=video_id, user=request.user.pk).delete() # decrement for like table
Entry.decrement_like(video_id=video_id) # increment for entry table
action = -1 # unit for ajax-refresh counter on page
else:
# plus. create record. increment for like table
Like.objects.create(video_id=video_id, user=request.user.pk)
Entry.increment_like(video_id=video_id)
action = 1
data = {
'is_authenticated': is_authenticated,
'action': action
}
return HttpResponse(json.dumps(data), content_type='application/json')
проблема в том, что здесь не все ошибки предусмотрены. например может не сработать:
Like.objects.filter(video_id=video_id, user=request.user.pk).delete()
или не сработать:
Entry.decrement_like(video_id=video_id)
или они вместе не сработают по какой-либ причине(например блокировка таблицы другим процессом, или проблемы не сервере, или не соответствие типа переданных данных, или ещё много чего)
или вот это строка на проверит правильно условие(например браузер заглючил и не передал заголовки):
if request.method == 'POST' and request.is_ajax():
в общем случиться может много чего даже в этом простейшем коде. а задачи обычно бывают сложнее. поэтому хотелось бы знать какие шаблоны существуют для напиания устойчивого к ошибкам кода.
вариант на каждом шагу использовать конструкцию типа try/catch/else/finally большой пользы не принесёт так как код сразу теряет читаемость. всё таки эта конструкция на шаблон, а просто часть синтаксиса
кто как решает описанную задачу?