Ticket #5048: ticket5048.diff

File ticket5048.diff, 2.7 KB (added by Jan Rademaker <j.rademaker@…>, 17 years ago)
  • django/template/__init__.py

     
    678678                        else:
    679679                            try: # method call (assuming no args required)
    680680                                current = current()
    681                             except TypeError: # arguments *were* required
    682                                 # GOTCHA: This will also catch any TypeError
    683                                 # raised in the function itself.
    684                                 current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
     681                            except TypeError:
     682                                from sys import exc_info
     683                                from traceback import extract_tb
     684                                exc = exc_info()
     685                                if len(extract_tb(exc[-1], 2)) == 1:
     686                                     # invalid method call, args *were* required
     687                                    current = settings.TEMPLATE_STRING_IF_INVALID
     688                                else:
     689                                    # TypeError was raised from within the function itself
     690                                    raise
    685691                            except Exception, e:
    686692                                if getattr(e, 'silent_variable_failure', False):
    687693                                    current = settings.TEMPLATE_STRING_IF_INVALID
    688694                                else:
    689695                                    raise
    690                 except (TypeError, AttributeError):
     696                except AttributeError:
    691697                    try: # list-index lookup
    692698                        current = current[int(bits[0])]
    693699                    except (IndexError, # list index out of range
  • tests/regressiontests/templates/tests.py

     
    6868
    6969    def method4(self):
    7070        raise SomeOtherException
     71   
     72    def method5(self):
     73        raise TypeError
    7174
    7275class OtherClass:
    7376    def method(self):
     
    189192            # Embedded newlines make it not-a-tag.
    190193            'basic-syntax24': ("{{ moo\n }}", {}, "{{ moo\n }}"),
    191194
     195            # Allow TypeError exceptions to propagate
     196            'basic-syntax25': ("{{ var.method5 }}", {"var": SomeClass()}, TypeError),
     197
    192198            # List-index syntax allows a template to access a certain item of a subscriptable object.
    193199            'list-index01': ("{{ var.1 }}", {"var": ["first item", "second item"]}, "second item"),
    194200
Back to Top