Try und catch

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
wie könnte man für glob ein try catch Block bauen:

Code: Alles auswählen

for file in glob(os.path.join(Path2files, "*.txt")):
Und wie würde ein try catch Block für schreiben aussehen?

Viele Grüße
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und wo soll da eine Exception geworfen werden? `glob.glob` tut das naemlich nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mit hat geschrieben:Hallo,
wie könnte man für glob ein try catch Block bauen:

Code: Alles auswählen

for file in glob(os.path.join(Path2files, "*.txt")):

Code: Alles auswählen

try:
    for file in glob(os.path.join(Path2files, "*.txt")):
        # tue was
except Exception, e:
    print e
Natürlich ist das so extrem gefährlich, weil Du jede Exception abfängst. Du musst natürlich noch die genaue Exception angeben und im Code ersetzen.
Und wie würde ein try catch Block für schreiben aussehen?
Da kapiere ich jetzt die Frage nicht. Was ist denn "schreiben". Der Block an sich sieht immer so aus wie oben. Ggf. kommt manchmal ein finally oder ein else dazu. Das kann man aber ja pauschal nicht sagen, da es auf die Logik des konkreten Problems ankommt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Sorry, ich habe meine Frage nicht klar gestellt. Ich habe Stellen im dem Beispiel Code markiert ('# try ?') die vielleicht Exception benötigen.

Code: Alles auswählen

#!/usr/bin/env python
import os
from glob import glob

def testTry(input_File, output_gffs_file_names):
  
  for line in input_File:
    # try ?
    output_file_names[line].write('\t'.join(line) + '\n')

if __name__ == '__main__':
  output__file_names = {}
  input_File = []
  # try ?
  outputResHandle = open("results.txt", 'w')

  # try ?
  for line in open("inputFile.txt", 'r'):
    line = line.rstrip().split(',')
    input_File.append(line)

  # try ?
  outputResHandle.write(', '.join(input_File[0]) + '\n')

  try:
    for file in glob(os.path.join("../tests", "*.txt")):
      fileNameOutput = os.path.splitext(file)[0] + "-results.txt"
      temp = []

      # try?
      for line in open(file, 'r'):
        line = line.rstrip().split('\t')
        temp.append(line)
      
      # try ?
      output_file_names[file] = open(gffFileNameOutput, 'w')
  except Exception, e:
    print e
    
  testTry(input_File[1:], output_file_names)
Ich bin leider nicht sicher wie man es Richtig machen könnte um alle Problem abzufangen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Der Code sieht ziemlich wüst aus. Um es kurz zu machen: Lies einfach in der Doku nach, welche Exception unter welchen Bedingungen von einer von Dir genutzten Funktion geworfen werden. Als Beispiel sei hier mal auf die open() Funktion verwiesen.

Die wichtigste Frage ist jedoch, was Du im Falle einer Exception tun willst. Willst Du mitbekommen, was passiert ist, ohne zu handeln? Oder soll das Programm weiterlaufen?

Generell sollte man niemals mittels "Exception" alle Excpetions abfangen - wie ich ja schon schrieb. Denn dann passiert evtl. etwas von Dir nicht eingeplantes und Du bekommst es nicht mit.

Kannst Du nicht mal kurz erläutern, worum es bei diesem konkreten Beispiel gehen soll?

Nebenbei würde ich Dateien immer mit "with" öffnen; damit wird sie auf jeden Fall geschlossen, egal ob ein Fehler auftrat oder nicht. Und Dateien sollten immer geschlossen werden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Probier doch einfach aus welche Exceptions geworfen werden wenn ein bestimmter Fehler auftritt.

Code: Alles auswählen

>>> f = open("gibt_es_nicht.txt", "r")
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    f = open("gibt_es_nicht.txt", "r")
IOError: [Errno 2] No such file or directory: 'gibt_es_nicht.txt'
Diesen Fehler kannst du dann entsprechend abfangen

Code: Alles auswählen

>>> try:
...     f = open("gibt_es_nicht.txt", "r")
... except IOError:
...     print "Schiefgegangen..."

Schiefgegangen...
Pauschal alle Exceptions abzufangen ist generell keine gute Idee, da vielleicht auch Exceptions abgefangen werden wie SystemExit oder KeyboardInterrupt. Also erst überlegen was passieren könnte, dann überlegen welche Exception dabei geworfen würde und speziell diese dann abfangen. Wenn dann irgendwelche vollkommen unvorhergesehenen Dinge passieren ist es besser wenn diese dann eine nachvollziehbare Fehlermeldung provozieren, als wenn mit einem instabilen Zustand weitergearbeitet wird.

MFG HerrHagen

EDIT: IOError ist vielleicht ein schlechtes Beispiel da sich hier noch eine ganze Menge anderer Fehler verbergen können, aber das Grundprinzip bleibt das gleiche.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Ich glaube, ich bin nicht der einzige, der dich nicht versteht:
- ich versteh nicht was du gerade fragst - zumindest dein letzter Satz klingt, als hättest du ein konkretes Problem, aber du beschreibst es nicht und du postest keine Fehlermeldungen
- ich verstehe nicht was dein Code tun soll/tut.

Wenn du eine relativ neue Python-version nutzt (>2.5) nimm das with-statement beim öffnen der Dateien (das ersetzt aber try:...finally:.. und nicht try:... except:...).

Werd die globalen variablen los (z.B. output_file_names)

Schreibe ein paar Kommentare da rein, warum du was wie geschrieben hast.

hth, Jörg

PS. Ich kann dein Programm nicht testen und ich hoffe Search&replace hat alle Namen erwischt, aber macht dieses Programm noch was es soll?
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Antworten