###
9.3.3 ListErrors

The template:

      #import pprint
      #errorCatcher ListErrors
      $noValue
      $anotherMissingValue.really
      $pprint.pformat($errorCatcher.listErrors)
      ## This is really self.errorCatcher().listErrors()

The output:

      $noValue
      $anotherMissingValue.really
      [{'code': 'VFS(SL,"noValue",1)',
        'exc_val': <NameMapper.NotFound instance at 0x8170ecc>,
        'lineCol': (3, 1),
        'rawCode': '$noValue',
        'time': 'Wed May 15 00:38:23 2002'},
       {'code': 'VFS(SL,"anotherMissingValue.really",1)',
        'exc_val': <NameMapper.NotFound instance at 0x816d0fc>,
        'lineCol': (4, 1),
        'rawCode': '$anotherMissingValue.really',
        'time': 'Wed May 15 00:38:23 2002'}]

The generated import:

      import pprint

Then in the generated class, we have our familiar `.respond` method and several new methods:

      def __errorCatcher1(self, localsDict={}):
          """
          Generated from $noValue at line, col (3, 1).
          """

          try:
              return eval('''VFS(SL,"noValue",1)''', globals(), localsDict)
          except self._errorCatcher.exceptions(), e:
              return self._errorCatcher.warn(exc_val=e, code= 'VFS(SL,"noValue",1)' ,
      	    rawCode= '$noValue' , lineCol=(3, 1))

      def __errorCatcher2(self, localsDict={}):
          """
          Generated from $anotherMissingValue.really at line, col (4, 1).
          """

          try:
              return eval('''VFS(SL,"anotherMissingValue.really",1)''', globals(),
      	    localsDict)
          except self._errorCatcher.exceptions(), e:
              return self._errorCatcher.warn(exc_val=e,
      	    code= 'VFS(SL,"anotherMissingValue.really",1)' ,
      	    rawCode= '$anotherMissingValue.really' , lineCol=(4, 1))

      def __errorCatcher3(self, localsDict={}):
          """
          Generated from $pprint.pformat($errorCatcher.listErrors) at line, col
          (5, 1).
          """

          try:
              return eval('''VFN(pprint,"pformat",0)(VFS(SL,
      	    "errorCatcher.listErrors",1))''', globals(), localsDict)
          except self._errorCatcher.exceptions(), e:
              return self._errorCatcher.warn(exc_val=e, code=
      	    'VFN(pprint,"pformat",0)(VFS(SL,"errorCatcher.listErrors",1))' ,
      	    rawCode= '$pprint.pformat($errorCatcher.listErrors)' ,
      	    lineCol=(5, 1))

      def respond(self,
              trans=None,
              dummyTrans=False,
              VFS=valueFromSearchList,
              VFN=valueForName,
              getmtime=getmtime,
              currentTime=time.time):

          """
          This is the main method generated by Cheetah
          """

          if not trans:
              trans = DummyTransaction()
              dummyTrans = True
          write = trans.response().write
          SL = self._searchList
          filter = self._currentFilter
          globalSetVars = self._globalSetVars

          ########################################
          ## START - generated method body

          if exists(self._filePath) and getmtime(self._filePath) > self._fileMtime:
              self.compile(file=self._filePath)
              write(getattr(self, self._mainCheetahMethod_for_x)(trans=trans))
              if dummyTrans:
                  return trans.response().getvalue()
              else:
                  return ""
          if self._errorCatchers.has_key("ListErrors"):
              self._errorCatcher = self._errorCatchers["ListErrors"]
          else:
              self._errorCatcher = self._errorCatchers["ListErrors"] = \
      	    ErrorCatchers.ListErrors(self)
          write(filter(self.__errorCatcher1(localsDict=locals())))
              # generated from '$noValue' at line 3, col 1.
          write('\n')
          write(filter(self.__errorCatcher2(localsDict=locals())))
              # generated from '$anotherMissingValue.really' at line 4, col 1.
          write('\n')
          write(filter(self.__errorCatcher3(localsDict=locals())))
              # generated from '$pprint.pformat($errorCatcher.listErrors)' at line
      	# 5, col 1.
          write('\n')
          #  This is really self.errorCatcher().listErrors()

          ########################################
          ## END - generated method body

          if dummyTrans:
              return trans.response().getvalue()
          else:
              return ""

So whenever an error catcher is active, each placeholder gets wrapped in its own method. No wonder error catchers slow down the system!