##// END OF EJS Templates
Merge branch 'removetwisted' of https://github.com/ellisonbg/ipython into remove_twisted
Merge branch 'removetwisted' of https://github.com/ellisonbg/ipython into remove_twisted

File last commit:

r2646:fd1aa87a
r3519:bea51041 merge
Show More
crashhandler.py
179 lines | 6.1 KiB | text/x-python | PythonLexer
Brian Granger
More work on the crash handler....
r2506 # encoding: utf-8
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 """sys.excepthook for IPython itself, leaves a detailed report on disk.
Fernando Perez
Update copyright/author statements....
r1875
Brian Granger
More work on the crash handler....
r2506 Authors:
Fernando Perez
Update copyright/author statements....
r1875
Brian Granger
More work on the crash handler....
r2506 * Fernando Perez
* Brian E. Granger
Fernando Perez
Remove svn-style $Id marks from docstrings and Release imports....
r1853 """
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
Brian Granger
More work on the crash handler....
r2506 #-----------------------------------------------------------------------------
# Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
# Copyright (C) 2008-2010 The IPython Development Team
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
Brian Granger
More work on the crash handler....
r2506 #-----------------------------------------------------------------------------
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
Brian Granger
More work on the crash handler....
r2506 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
fperez
Cosmetic cleanups: put all imports in a single line, and sort them...
r52 import os
import sys
Brian Granger
ColorANSI.py -> utils/coloransi.py and all imports updated.
r2010 from pprint import pformat
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
Brian Granger
ultraTB.py => core/ultratb.py and imports updated.
r2048 from IPython.core import ultratb
Brian Granger
More work on the crash handler....
r2506 from IPython.external.Itpl import itpl
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 from IPython.utils.sysinfo import sys_info
Fernando Perez
Moved system info into its own utility, so we can use in in test suite too.
r2495
Brian Granger
More work on the crash handler....
r2506 #-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
Fernando Perez
Update copyright/author statements....
r1875
Brian Granger
More work on the crash handler....
r2506 # Template for the user message.
_default_message_template = """\
Oops, $self.app_name crashed. We do our best to make it stable, but...
Fernando Perez
Moved system info into its own utility, so we can use in in test suite too.
r2495
Brian Granger
More work on the crash handler....
r2506 A crash report was automatically generated with the following information:
- A verbatim copy of the crash traceback.
- A copy of your input history during this session.
- Data on your current $self.app_name configuration.
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
Brian Granger
More work on the crash handler....
r2506 It was left in the file named:
\t'$self.crash_report_fname'
If you can email this file to the developers, the information in it will help
them in understanding and correcting the problem.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 You can mail it to: $self.contact_name at $self.contact_email
with the subject '$self.app_name Crash Report'.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 If you want to do it now, the following command will work (under Unix):
mail -s '$self.app_name Crash Report' $self.contact_email < $self.crash_report_fname
To ensure accurate tracking of this issue, please file a report about it at:
$self.bug_tracker
"""
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 class CrashHandler(object):
"""Customizable crash handlers for IPython applications.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 Instances of this class provide a :meth:`__call__` method which can be
used as a ``sys.excepthook``. The :meth:`__call__` signature is::
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 def __call__(self, etype, evalue, etb)
"""
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 message_template = _default_message_template
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 def __init__(self, app, contact_name=None, contact_email=None,
bug_tracker=None, show_crash_traceback=True, call_pdb=False):
"""Create a new crash handler
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 Parameters
----------
app : Application
A running :class:`Application` instance, which will be queried at
crash time for internal information.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 contact_name : str
A string with the name of the person to contact.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 contact_email : str
A string with the email address of the contact.
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Brian Granger
More work on the crash handler....
r2506 bug_tracker : str
A string with the URL for your project's bug tracker.
show_crash_traceback : bool
If false, don't print the crash traceback on stderr, only generate
the on-disk report
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
Non-argument instance attributes:
Brian Granger
More work on the crash handler....
r2506 These instances contain some non-argument attributes which allow for
further customization of the crash handler's behavior. Please see the
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 source for further details.
"""
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 self.app = app
Brian Granger
More work on the crash handler....
r2506 self.app_name = self.app.name
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 self.contact_name = contact_name
self.contact_email = contact_email
self.bug_tracker = bug_tracker
Brian Granger
More work on the crash handler....
r2506 self.crash_report_fname = "Crash_report_%s.txt" % self.app_name
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 self.show_crash_traceback = show_crash_traceback
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 self.section_sep = '\n\n'+'*'*75+'\n\n'
Fernando Perez
Added ability to invoke pdb on IPython crashes....
r2437 self.call_pdb = call_pdb
#self.call_pdb = True # dbg
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
Brian Granger
More work on the crash handler....
r2506 def __call__(self, etype, evalue, etb):
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 """Handle an exception, call for compatible with sys.excepthook"""
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
# Report tracebacks shouldn't use color in general (safer for users)
color_scheme = 'NoColor'
# Use this ONLY for developer debugging (keep commented out for release)
#color_scheme = 'Linux' # dbg
try:
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 rptdir = self.app.ipython_dir
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 except:
rptdir = os.getcwd()
Fernando Perez
Ensure crash handler works even when app isn't fully configured yet....
r2646 if rptdir is None or not os.path.isdir(rptdir):
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 rptdir = os.getcwd()
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 report_name = os.path.join(rptdir,self.crash_report_fname)
# write the report filename into the instance dict so it can get
# properly expanded out in the user message template
self.crash_report_fname = report_name
Brian Granger
More work on the crash handler....
r2506 TBhandler = ultratb.VerboseTB(
color_scheme=color_scheme,
long_header=1,
call_pdb=self.call_pdb,
)
Fernando Perez
Added ability to invoke pdb on IPython crashes....
r2437 if self.call_pdb:
TBhandler(etype,evalue,etb)
return
else:
traceback = TBhandler.text(etype,evalue,etb,context=31)
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
# print traceback to screen
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 if self.show_crash_traceback:
print >> sys.stderr, traceback
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
# and generate a complete report on disk
try:
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 report = open(report_name,'w')
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0 except:
print >> sys.stderr, 'Could not create crash report on disk.'
return
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 # Inform user on stderr of what happened
Brian Granger
More work on the crash handler....
r2506 msg = itpl('\n'+'*'*70+'\n'+self.message_template)
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 print >> sys.stderr, msg
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 # Construct report on disk
report.write(self.make_report(traceback))
report.close()
Fernando Perez
Cleaner error message in crash handler.
r2402 raw_input("Hit <Enter> to quit this message (your terminal may close):")
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 def make_report(self,traceback):
"""Return a string containing a crash report."""
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403
sec_sep = self.section_sep
Fernando Perez
Moved system info into its own utility, so we can use in in test suite too.
r2495 report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n']
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 rpt_add = report.append
Fernando Perez
Moved system info into its own utility, so we can use in in test suite too.
r2495 rpt_add(sys_info())
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381
try:
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 config = pformat(self.app.config)
Brian Granger
More work on the crash handler....
r2506 rpt_add(sec_sep)
rpt_add('Application name: %s\n\n' % self.app_name)
rpt_add('Current user configuration structure:\n\n')
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 rpt_add(config)
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 except:
pass
Fernando Perez
Move crash handling to the application level and simplify class structure....
r2403 rpt_add(sec_sep+'Crash traceback:\n\n' + traceback)
fperez
Reorganized the directory for ipython/ to have its own dir, which is a bit...
r0
fptest
- Made the internal crash handler very customizable for end-user apps based...
r381 return ''.join(report)