django的auth中间件有这个代码:
def get_user(request):
"""
Returns the user model instance associated with the given request session.
If no user is retrieved an instance of `AnonymousUser` is returned.
"""
from .models import AnonymousUser
user = None
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
except KeyError:
pass
else: # <------ this doesnot have if-part, but how is it meant to work?
if backend_path in settings.AUTHENTICATION_BACKENDS:
# more code...
Run Code Online (Sandbox Code Playgroud)
该else部分是有趣的,它亘古不变的有if双组分,这是什么?真的很酷,如果我还不知道这一点
该else形式的其他部分try except
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
except KeyError:
pass
else:
if backend_path in settings.AUTHENTICATION_BACKENDS:
# more code...
Run Code Online (Sandbox Code Playgroud)
该else条款在出现时必须遵守除条款以外的所有条款.如果try子句不引发异常,则必须执行的代码很有用.
在这里它只有在代码没有引发任何时才会被执行 KeyErrors
例
考虑我们有一本字典
>>> a_dict={"key" : "value"}
Run Code Online (Sandbox Code Playgroud)
我们可以try except用来处理KeyErroras
>>> try:
... print a_dict["unknown"]
... except KeyError:
... print "key error"
...
key error
Run Code Online (Sandbox Code Playgroud)
现在,我们需要检查是否发生了键错误,如果没有,else则执行该子句
>>> try:
... print a_dict["key"]
... except KeyError:
... print "key error"
... else:
... print "no errors"
...
value
no errors
Run Code Online (Sandbox Code Playgroud)
如果提出任何except条款,那么它将不会被执行.
>>> try:
... print a_dict["unkown"]
... except KeyError:
... print "key error"
... else:
... print "no errors"
...
key error
Run Code Online (Sandbox Code Playgroud)