Portál AbcLinuxu, 6. května 2025 13:48

Dotaz: PYTHON error handling

17.5.2011 02:20 adrinko | skóre: 22
PYTHON error handling
Přečteno: 212×
Odpovědět | Admin
prosím, prečo mi tu nefunguje správne error handling? v def kazdych_5_sekund je selecta namiesto select a preto by to malo vypisať Oops. Ono to avšak nefunguje a vypíše to celý traceback. prečo? vyskúšal som, že ak by bol preklep napr v def __init__(self), tak by to správne vypísalo Oops, ale keď je preklep alebo chyba nižšie, tak to nefunguje. prečo? chcel by som, aby sa vždy vypísalo len Oops pri akejkoľvek chybe, kdekoľvek v kóde. vďaka vopred za nakopnutie

# -*- coding: utf-8 -*-
import sys      
import traceback 


try:
  import pygtk
  pygtk.require("2.0")
  import gtk
  import gobject

  class jednoduchy_textovy_prohlizec (Exception):

      def __init__(self):
   
          ## naimportovanie firebird db
          import kinterbasdb
          self.con = kinterbasdb.connect(dsn=db, user=usr, password=psw)
          self.cur = self.con.cursor()        
            
          self.okno = gtk.Window()
          self.okno.set_title("Textový editor")
          self.okno.set_border_width(10)
  
          # Editor
          self.textovy_buffer = gtk.TextBuffer()
          self.textovy_prohlizec = gtk.TextView(self.textovy_buffer)
          self.posuvnikove_okno = gtk.ScrolledWindow()
          self.posuvnikove_okno.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
          self.posuvnikove_okno.add_with_viewport(self.textovy_prohlizec)
  
          # Zabalení menu a editoru do VBoxu
          self.vbox = gtk.VBox(False, 5)
          self.vbox.pack_end(self.posuvnikove_okno)
  
          self.okno.add(self.vbox)
          self.okno.show_all()
  
          self.okno.connect("destroy", gtk.main_quit)
          
          # Tímto si vyrobíme "timer" po 5 sekundách
          # timer_id lze využít pro "vypnutí" timeru pomocí gobject.source_remove(timer_id)
          timer_id = gobject.timeout_add(1000, self.kazdych_5_sekund)
  
      def kazdych_5_sekund(self):
          SELECT = "selecta * from aaa"
          self.cur.execute(SELECT)
          for row in self.cur.itermap():
              id = 'ID:%(ID)s' % row
              print id
          return True     # Toto způsobí že se toto bude opakovat každých 5s, False - provede se pouze jednou
 
  if __name__ == "__main__":
      aplikace = jednoduchy_textovy_prohlizec()
      gtk.main()


#odchytava
except (RuntimeError, TypeError, NameError, Exception):
  print "Oops!"
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.5.2011 08:46 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: PYTHON error handling
Odpovědět | | Sbalit | Link | Blokovat | Admin
Především je ve výše uvedeném kódu několik chyb.
1) od třídy Exception dědí pouze střídy, ve kterých definuješ vlastní výjimky
2) to jak jsi použil try ... except je řekněme chybné
Kde odchytávat výjimky? Zde záleží na tobě, kterou část kódu považuješ za důležitou a vhodnou pro "zabezpečení".

Návrh:
import pygtk
pygtk.require("2.0")
import gtk
import gobject

class jednoduchy_textovy_prohlizec:

      def __init__(self):
      	# .....
 
      def kazdych_5_sekund(self):
          SELECT = "selecta * from aaa"
          try:
              self.cur.execute(SELECT)
          except "vyjika vyvolana pri execute modulem kinterbasdb":
              print "Oops!"
              return False
          for row in self.cur.itermap():
              id = 'ID:%(ID)s' % row
              print id
          return True     # Toto způsobí že se toto bude opakovat každých 5s, False - provede se pouze jednou
 
if __name__ == "__main__":
	  # a pripadne odchytit ostatni vyjimky, ktere dedi od nize uvedenych. podle me je to zbytecne a spis se zamerit
          # na odchyceni konkretnich vyjimek primo ve tride nebo pri importu
	  try:
	  	aplikace = jednoduchy_textovy_prohlizec()
	  	gtk.main()
	  except (RuntimeError, TypeError, NameError, Exception):
	  	print "Oops!"

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.