Try:/Except IOError kaskadieren

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
Knuffi
User
Beiträge: 60
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo Leute,
ich wünsche ein guten Morgen und hoffe auf eure Hilfe.
Bedingt durch ein etwas langes Kabel (habe bereits einen Extentionchip in die Leitung eingebaut) bekomme ich doch manchmal Problem Ddressen auf dem I2c Bus anzusprechen.
Ich habe mich erfolgreich damit beholfen, mit "Try und Except" zu arbeiten.
das Programm sieht so aus:

try:
.xxxxx
except IOError:
..try:
.. xxxx
. except IOError:
.. try:
...xxxxx
... exept IOError
.. xxxxx

wer hat eine Idee diese Verschachtelung zu verkürzen. Ich bin noch Anfänger mit Python und habe keine Plan das selber zu programmieren.
Danke schon mal vorab
Gruß
Knuffi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was soll denn da passieren? Soll das ganze X-mal wiederholt werden, für den Fall eines ``IOError``? Wenn ja, löst man das ganz einfach in einer Schleife, die X-mal wiederholt wird. Im Erfolgsfall verlässt man diese vorzeitig mittels ``return`` oder ``break``.

Du hättest für den Code die Python Code Tags verwenden sollen. Man muss da kein valides oder lauffähiges Python reinschreiben, die "Lücken" kann man auch mit Kommentaren füllen:

Code: Alles auswählen

try:
    # do something
except IOError:
    try:
        # try again
    except IOError:
        pass
Ist einfacher, als sich mit "Punkten" zu behelfen, die die Einrückungsebene symbolisieren sollen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Knuffi
User
Beiträge: 60
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo Hyperion

klar sieht besser aus, aber wie funktioniert das?
Gruß
Knuffi
BlackJack

@Knuffi: In dem man den Quelltext in Code-Tags setzt. Über dem Textfeld zum bearbeiten des Beitrags ist eine Button-Leiste da ist unter anderem ein Knopf mit der Aufshrift `Code` mit einer Dropdown-Box daneben wo man vorher die Sprache auswählen kann — Python ist die Voreinstellung. Du könntest bei Hyperion's Beitrag auch mal auf zitieren klicken, dann siehst Du wie es dort im Quelltext des Beitrags aussieht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du meinst das Setzen von Tags im Forum? Schau doch einfach beim Erstellen / Editieren auf die Menüleiste *direkt* oberhalb des großen Eingebafensters. Da Gibt es einen Button, auf dem Steht "Code" und daneben ein Auswahlmenü für die Sprache, wo Python voreingestellt ist. Den drückst Du und schon hast Du so etwas im Text stehen:

Code: Alles auswählen

[ Code=python file=Untitled.py ][ /Code ]
(Ohne die Leerzeichen)
Zwischen die Tags (Paare aus eckigen Klammern) schreibst Du Deinen Code.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Knuffi
User
Beiträge: 60
Registriert: Dienstag 28. Oktober 2014, 19:52

Code: Alles auswählen

[try]
[xxxx]
except IOError:
[try
[xxxx]
except IOError
[xxxx]

funktioniert irgendwie nicht
HILFE
Gruß
Knuffi
Zuletzt geändert von Hyperion am Samstag 21. Februar 2015, 12:13, insgesamt 1-mal geändert.
Grund: Schließendes Code Tag hinter den Code gesetzt ;-)
Knuffi
User
Beiträge: 60
Registriert: Dienstag 28. Oktober 2014, 19:52

Code: Alles auswählen

try:
  mach irgendwas
except IOError:
 mach noch was
Danke,
geht deutlich einfacher


bleibt nur noch das eigenliche Problem, wie ich die Kaskadierung verkürzen kann:

Code: Alles auswählen

try:
 a = bus.read_byte.data(0x38,0x01)
Except IOError:
 try:
  a = bus.read_byte.data(0x38,0x01)
 Except IOError:
  try:
   a = bus.read_byte.data(0x38,0x01)
  Except IOError:
   try:
    a = bus.read_byte.data(0x38,0x01)
Gruß
Knuffi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Knuffi hat geschrieben: bleibt nur noch das eigenliche Problem, wie ich die Kaskadierung verkürzen kann:
Das habe ich Dir doch schon in meiner ersten Antwort im ersten Absatz beantwortet ;-)

Im übrigen solltest Du Dich auch bei solchen Code Fragmenten an PEP8 halten, was insbesondere eine Einrückungstiefe von vier Leerzeichen verlangt. Das liest sich einfach besser, wenn das einheitlich uns sauber ausgeführt ist.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Knuffi
User
Beiträge: 60
Registriert: Dienstag 28. Oktober 2014, 19:52

Entschuldigung habe ich übersehen.
Habe eine While-Schleife programmier, funtioniert super.
Herzlichen Dank für Deine(Eure) Hilfe.
Gruß
Knuffi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bei einer ``while``-Schleife hast Du natürlich im schlimmsten Fall eine Endlosschleife. Entweder fügt man also ein zusätzliches Abbruchkriterium über die Zeit hinzu, oder man nutzt doch eine ``for``-Schleife und eine fixe Anzahl von Versuchen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten