I'd like to raise the topic of exception handling in templates, to see what people think of the current state and discuss possible improvements.
I personally find it confusing to use and create template tags at times, due to exception handling. Sometimes exceptions are supposed to be silenced, and sometimes not. The docs say that when writing custom template tags, the `render()` function should never raise `TemplateSyntaxError`, but some of Django's own template tags (e.g. `widthratio`) don't adhere to this policy. I have also had difficulty with inconsistent behaviour between development and production environments, due to the `TEMPLATE_DEBUG` setting. For example, if `TEMPLATE_DEBUG` is `False`, the `include` template tag will fail silently when passed a string or context variable. If `TEMPLATE_DEBUG` is `True` (often the case on local development servers) it will raise an exception at compile time only when passed a literal string argument, otherwise it will raise an exception at render time (again, against the advice in the docs) when passed a context variable. In order to mimic production behaviour in a development environment, you must set `TEMPLATE_DEBUG` to `False`, and then you miss out on useful debug information. When it comes time to test, and you have a template tag that does happen to raise an unhandled exception (e.g. `ValueError`), it will be transformed into `TemplateSyntaxError` if `TEMPLATE_DEBUG` is `True`. So you need to test for either exception in your tests, or override the `TEMPLATE_DEBUG` setting so that you can expect one exception or the other, or add a try/except block to the `render()` function of your template tag and either raise `TemplateSyntaxError` all the time (against the advice of the docs) or silence all exceptions, with either option possibly hiding problems that exist elsewhere in the code (in a function called by the template tag). I'd like to see a move towards consistent exception handling in templates for template tags and filters. I'd like to see no exceptions silenced by default, but provide a way for template authors to conditionally silence exceptions in fragments of their templates. Perhaps with a block tag. This should allow for consistent behaviour, make it easier to spot errors during development, and give developers the option of silencing specific exceptions when they need to do something conditionally, e.g. include a template that may or may not exist. I imagine that this would be a huge backwards incompatible change. Are there any less severe alternative steps we could take to improve the situation generally? Would it be possible to make such a change by following a deprecation path? Should built-in template tags follow the advice given in the docs, and never raise `TemplateSyntaxError` in their `render()` function? Cheers. -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.