V jednom z programů jsem potřeboval logovat chyby do databáze, nejvíc se mi líbil klasický pythonní výpis chyby:

  Traceback (most recent call last):
    File "Z:\python\errory\pok_01.py", line 40, in ?
      pepa()
    File "Z:\python\errory\pok_01.py", line 17, in pepa
      print "a"+1
  TypeError: cannot concatenate 'str' and 'int' objects

Tady ale nastal problém s tím, jak tento výpis uložit do proměnné, aby mohl být předán k uložení. Přes několik pokusů s přesměrováním sys.stderr:

  import sys
  soubor=file('chyby.txt','w')

  sys.stderr=soubor
  sys.stdout=soubor

  try:
      print "6"+4  # chyba
  except Exception,x:
      print Exception,'\n', x
      soubor.close()
      sys.stdout=sys.__stdout__
      sys.stderr=sys.__stderr__

nebo:

  class TeeStream:
      def __init__(self, *outstreams):
          self.outstreams=outstreams
      def write(self, text):
          for outstream in self.outstreams:
              outstream.write(text)

  import sys
  mylogfile  = open('stream_mylogfile.txt','w')
  sys.stdout = TeeStream (mylogfile, sys.stdout)
  sys.stderr = TeeStream (mylogfile, sys.stderr)

  print 4*55
  print wedsfsdf

  mylogfile.close()

jsem se nakonec po 'nakopnutí' od geona dostal k modulu traceback a napsal funkci get_exception():

  import sys,traceback

  def get_exception():
      exc=sys.exc_info()
      sys.exc_clear()
      ex_type=exc[0]
      ex_fault=exc[1]
      ex_trace_all=traceback.extract_tb(exc[2])
      ex_str='Traceback (most recent call last):\n'
      for ex_trace in ex_trace_all:
          ex_str+='  File "'+ex_trace[0]+'", line '+str(ex_trace[1])+', in '+ex_trace[2]+'\n'
          ex_str+='    '+ex_trace[3]+'\n'
      ex_str+=str(ex_type)+': '+str(ex_fault)
      return ex_str

  def pepa():
      print "a"+1

  try:
      print "6"+4  # chyba
  except:
      variable=get_exception()
      print variable

Výstup z programu vypadá takto:

  Traceback (most recent call last):
    File "Z:\python\errory\pok_01.py", line 20, in ?
      print "6"+4  # chyba
  exceptions.TypeError: cannot concatenate 'str' and 'int' objects

Tady je další geonových nakopnutí, nyní směrem k modulu StringIO:

  import traceback, StringIO

  def get_exception():

      vyjimka=StringIO.StringIO()          # vytvorime file-like objekt
      vyjimka.write("Exception in user code:\n")
      traceback.print_exc(file=vyjimka)    # kvuli teto funkci jsme to vse delali
      vyjimka.write('-'*60)
      chyba=vyjimka.getvalue()             # zapis hodnoty do promenne, abychom ....
      vyjimka.close()                      # ...mohli uvolnit pamet
      return chyba




subject:
  ( 112 subscribers )