code: def do_catch_fedora_errors(parser, token):
      
  
      END_TAGS = ('end_fedora_access',
                  'permission_denied', 'fedora_failed')
  
      blocks = {}
      blocks['fedora_access'] = parser.parse(END_TAGS)
      token = parser.next_token()
      while token.contents != 'end_fedora_access':
          # need to convert token.contents manually to a str. django gives us
          # a unicode. we use it below in **blocks, but python 2.6.2 and
          # earlier can't use **kwargs with unicode keys. (2.6.5 is ok with
          # it; not sure about intervening versions.) in any case, direct
          # conversion to string is safe here (i.e., no encoding needed)
          # because the parser guarantees it's one of our END_TAGS, which are
          # all ascii.
          current_block = str(token.contents)
          if current_block in blocks:
              raise template.TemplateSyntaxError(
                  current_block + ' may appear only once in a fedora_access block')
  
          blocks[current_block] = parser.parse(END_TAGS)
          token = parser.next_token()
  
      return CatchFedoraErrorsNode(**blocks)
docs: Catches fedora errors between ``{% fedora_access %}`` and
      ``{% end_fedora_access %}``. Template designers may specify 
      optional ``{% permission_denied %}`` and ``{% fedora_failed %}``
      sections with fallback content in case of permission or other errors
      while rendering the main block.
  
      Note that when Django's ``TEMPLATE_DEBUG`` setting is on, it precludes
      all error handling and displays the Django exception screen for all
      errors, including fedora errors, even if you use this template tag. Turn
      off ``TEMPLATE_DEBUG`` if that debug screen is getting in the way of the
      use of {% fedora_access %}.