Warning: Can't synchronize with repository "(default)" (Unsupported version control system "svn": No module named svn). Look in the Trac log for more information.

Changes between Version 3 and Version 4 of ErrorReporting


Ignore:
Timestamp:
08/29/06 17:40:48 (13 years ago)
Author:
owen
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ErrorReporting

    v3 v4  
    4444 
    4545Bear in mind that this method supresses exception output in the log so there is a chance that the exception could be lost forever. 
     46 
     47== Custom Error Reporting - Method 2 (Application Wide Catch All) == 
     48 
     49Personally I found the following worked much better if you have multiple controllers. You hook the code into your Root controller, and your done. This however makes use of CherryPy instead of TurboGears specifics. Readers should also check out the HowDoesErrorHandlingWork page for info on the exception_handler to do custom handling for each method. 
     50 
     51The following code has pretty much everything you need to provide a custom error page, and send an email to someone with the error. You will need to change the email settings though, but other then that should be good to go. (Tested in TG 0.9a6) 
     52 
     53{{{ 
     54class Root(controllers.RootController): 
     55        @turbogears.expose() 
     56        @identity.require(identity.in_group("user")) 
     57        def index(self): 
     58                return self.main() 
     59 
     60        def cp_on_http_error(self, status, message): 
     61                from cherrypy import _cputil 
     62                _cputil._cp_on_http_error(status, message) 
     63 
     64                # Go to a specific 404 page (don't want a lot of spam about people typing in wrong URLs) 
     65                if status == 404: 
     66                        url = "%s %s" % (cherrypy.request.method, cherrypy.request.path) 
     67                        output = dict( 
     68                                status = status, 
     69                                message = message or '-', 
     70                                theError = '404 - Page Not Found', 
     71                                admin = 'admin' in identity.current.identity().groups, 
     72                                url = url) 
     73 
     74                        template = ".templates.404_exception" 
     75                        format = 'html' 
     76                        content_type = 'text/html' 
     77                        mapping = None 
     78 
     79                        # Probably don't want to send an email, but it is here if you do 
     80                        #self.send_exception_to_developer(status, url, '404 error') 
     81 
     82                        # Return customized page 
     83                        body = controllers._process_output(output, template, format, content_type, mapping) 
     84                        cherrypy.response.headers['Content-Length'] = len(body) 
     85                        cherrypy.response.body = body 
     86                        return 
     87 
     88                import logging 
     89                log = logging.getLogger("turbogears.controllers") 
     90                log.exception('CherryPy %s error (%s)', status, message) 
     91 
     92                import traceback, StringIO 
     93                buf = StringIO.StringIO() 
     94                traceback.print_exc(file=buf) 
     95                url = "%s %s" % (cherrypy.request.method, cherrypy.request.path) 
     96 
     97                self.send_exception_to_developer(status, url, buf.getvalue()) 
     98 
     99                theError = { 
     100                        400: u'400 - Bad Request', 
     101                        401: u'401 - Unauthorized', 
     102                        403: u'403 - Forbidden', 
     103                        404: u'404 - Not Found', 
     104                        500: u'500 - Internal Server Error', 
     105                        501: u'501 - Not Implemented', 
     106                        502: u'502 - Bad Gateway', 
     107                }.get(status, message or u'General Error')  
     108 
     109                output = dict( 
     110                        status = status, 
     111                        message = message or '-', 
     112                        theError = theError, 
     113                        admin = 'admin' in identity.current.identity().groups, 
     114                        url = url, 
     115                        details = buf.getvalue()) 
     116 
     117                template = ".templates.unhandled_exception" 
     118                format = 'html' 
     119                content_type = 'text/html' 
     120                mapping = None 
     121 
     122                # Return customized page 
     123                body = controllers._process_output(output, template, format, content_type, mapping) 
     124                cherrypy.response.headers['Content-Length'] = len(body) 
     125                cherrypy.response.body = body  
     126 
     127        # Hook in error stuff for production only 
     128        if turbogears.config.get('server.environment') == 'production': 
     129                _cp_on_http_error = cp_on_http_error 
     130 
     131        def send_exception_to_developer(self, status, url, data): 
     132                import smtplib 
     133                from email.MIMEMultipart import MIMEMultipart 
     134                from email.MIMEBase import MIMEBase 
     135                from email.MIMEText import MIMEText 
     136                from email.Utils import formatdate 
     137 
     138                fromAddy = "Server <server@mydomain.com>" 
     139                to = "servererrors@server@mydomain.com" 
     140 
     141                msg = MIMEMultipart() 
     142                msg['From'] = fromAddy 
     143                msg['To'] = to 
     144                msg['Date'] = formatdate(localtime=True) 
     145                msg['Subject'] = '%d ERROR on the Server' % status 
     146 
     147                text = "----------URL----------\n%s\n----------DATA:----------\n%s" % (url, data) 
     148 
     149                msg.attach(MIMEText(text)) 
     150 
     151                smtp = smtplib.SMTP("mailserver.net") 
     152                smtp.login('username', 'password') 
     153                smtp.sendmail(fromAddy, to, msg.as_string()) 
     154                smtp.close() 
     155}}} 
     156 
     157For the lazy out there who wanted to know how to handle an exception on each mehod but didn't follow the above link, here is the code you want: 
     158 
     159{{{ 
     160class Root(controllers.RootController): 
     161    @turbogears.expose() 
     162    def error(self): 
     163        return "An error ocured" 
     164 
     165    @turbogears.expose() 
     166    @turbogears.controllers.exception_handler(error, "ValueError") 
     167    def index(self): 
     168        raise ValueError 
     169}}} 
     170 
     171References: 
     172http://groups.google.com/group/turbogears/browse_frm/thread/61a48b1f7fdfe354/de325500f437f632?lnk=gst&q=custom+500&rnum=1#de325500f437f632 
     173http://groups.google.com/group/turbogears/browse_thread/thread/ba80c6d7ecc4a349/5522ae1cfceab877?lnk=gst&q=_cp_on_error&rnum=3#5522ae1cfceab877 
     174http://groups.google.com/group/turbogears/browse_thread/thread/e7c103acb7b786ab/263115b72e9dfcd4?lnk=gst&q=exception_handler&rnum=5#263115b72e9dfcd4