django - 捕获多个异常

don*_*yor 8 python django exception

我有这个视图功能:

def forum(request):
qs = Forum.objects.all()
try:
    f = Forum.objects.filter().order_by('-id')[0] <------------problem
    return render_to_response("forum.html",{'qs':qs,'f':f},context_instance=RequestContext(request))
except Forum.DoesNotExist or IndexError:
    return render_to_response("forum.html",{'qs':qs},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

但它仍然为上面的问题行提供以下错误:

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

我的代码好吗?我能以这种方式捕获多个例外吗?

Amb*_*ber 15

在代码中有这个:

except Forum.DoesNotExist or IndexError:
Run Code Online (Sandbox Code Playgroud)

它实际上被评估为:

except (Forum.DoesNotExist or IndexError):
Run Code Online (Sandbox Code Playgroud)

括号中的位是一个计算表达式.因为or如果它是真正的(它是一个类),它返回它的第一个参数,那实际上只相当于:

except Forum.DoesNotExist:
Run Code Online (Sandbox Code Playgroud)

如果你想实际捕获多种不同类型的异常,你可以改为使用元组:

except (Forum.DoesNotExist, IndexError):
Run Code Online (Sandbox Code Playgroud)


Bra*_*don 12

您可以通过这种方式捕获多个异常

try:
    ...
except (Forum.DoesNotExist, IndexError) as e:
   ...
Run Code Online (Sandbox Code Playgroud)


Jay*_*odi 7

如果你想记录/处理每个异常,那么你可以这样做。

from django.core.exceptions import ObjectDoesNotExist

try:
    your code here
except KeyError:
    logger.error('You have key error')
except ObjectDoesNotExist:
    logger.error('Object does not exist error')
Run Code Online (Sandbox Code Playgroud)