configparser NoOptionError

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Versuche gerade meinem Programm einige Einstellungen beizubingen. Die sollen aus einer Configdatei kommen, welche augenblicklich NICHT existiert. Beim Zugriff auf [section][Schlüssel] mit configparser.getint() wir im Modul configparser eine Exeption NoOptionError ausgelöst. Mit try: except: kann ich den nicht abfangen. Wie löst man ein solches Problem? muss ich die Klassen NoOptionError und Error (eventuell noch andere) aus dem configparser ableiten?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich würde dein vorgehen mal ganz platt also "absurd" bezeichnen. Du programmierst etwas, was 100% einen Fehler wirft und versuchst dann, den Fehler abzufangen. Programmiere doch direkt so, dass normalerweise _kein_ Fehler geworfen wird, sondern nur, wenn wirklich unvorhergesehener Weise was schief läuft. Konkret: füll' die Config-Datei mit Leben.

Gruß, noisefloor
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

@Noisfloor: Lernphase :oops: Aber das ist doch nicht ungewöhnlich, dass z.B. eine neue Programmversion erst einmal keine Schlüssel und Defaultwerte beim ersten Start vorfindet.Da muss es eine Lösung geben. Klar kann ich einen Editor nehmen und die Datei anlegen. Aber erkläre einem DAU mal, er solle den vim öffnen, ........
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Aber das ist doch nicht ungewöhnlich, dass z.B. eine neue Programmversion erst einmal keine Schlüssel und Defaultwerte beim ersten Start vorfindet.
Sehe ich anders. Wenn es keine Schlüssel-Werte Paare gibt, dann muss es eben Default-Werte geben, damit das Programm funktioniert. Die ganzen `get` Sachen des configparser-Moduls kennen dafür z.B. die Option `fallback` - siehe Doku.
Klar kann ich einen Editor nehmen und die Datei anlegen. Aber erkläre einem DAU mal, er solle den vim öffnen, ........
Wenn du für Systeme programmierst, wo nur vim als Editor installiert ist, sitzt garantiert auch kein DAU davor ;-)

Dein ursprüngliches Problem kann ich ansonsten auch nicht nachvollziehen - der Fehler ist doch wie alle anderen Exceptions in Python auch abfangbar.

Wenn du `import configparser` (Python 3) machst, kannst du den Fehler mit `except configparser.NoOptionError` abfangen.

Gruß, noisefloor
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

noisefloor hat geschrieben:Die ganzen `get` Sachen des configparser-Moduls kennen dafür z.B. die Option `fallback` - siehe Doku.
habe ich probiert. Wenn du sagst das muss gehen, dann probier ich halt so lange, bis es geht!
noisefloor hat geschrieben:Wenn du für Systeme programmierst, wo nur vim als Editor installiert ist, sitzt garantiert auch kein DAU davor ;-)
Meine Erfahrungen sind da leider anders. Und für Windows gibt es den auch, da heißt er allerdings gvim.

Fehler abfangen ging leider nicht. Siehe hier

Code: Alles auswählen

    except NoOptionError:
NameError: name 'NoOptionError' is not defined
Sieht für mich so aus als, wenn ich die Existenz von Section und Option vor Zugriff überprüfen muss. Hatte eben noch einmal ins Handbuch geschaut und was gesehen.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Fehler abfangen ging leider nicht. Siehe hier
Weil du da wohl was falsch machst... Schau dir den letzten Satz meines vorherigen Posts nochmal _genau_ an und achte drauf a) was importiert wird und b) was hinter dem `except` steht.
habe ich probiert. Wenn du sagst das muss gehen, dann probier ich halt so lange, bis es geht!
Na ja, wie ein anderer, hier im Forum sehr aktiver User dir schon mehrfach sagte: "Programmieren ist nicht raten" :D

Und das geht ohne Probleme (Python 3.4):

Code: Alles auswählen

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['something'] = {'foo': 'bar', 'spam': '42'}
>>> config.get('something', 'foo')
'bar'
>>> config.get('something', 'egg', fallback='some default value')
'some default value'
>>>
Gruß, noisefloor
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Danke für das Beispiel. Dann lag es bei mir wohl daran, dass ich das von einem "leeren" Config Objekt probiert habe. Ich baue den Code einmal um, habe schon eine Idee wie ich das idiotensicher bekomme.

Jo und der NoOptionError ist jetzt auch in meinem Hirn importiert worden. :lol:
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

noisefloor hat geschrieben:(...)
Na ja, wie ein anderer, hier im Forum sehr aktiver User dir schon mehrfach sagte: "Programmieren ist nicht raten" :D
(...)
Solche Sätze empfinde ich als sehr arrogant und beleidigend und deshalb völlig überflüssig in diesem Forum.
BlackJack

@miracle173: Aber wenn es doch zutrifft, sogar nach den eigenen Aussagen des Fragestellers, der in mehr als einem Thema hier solange rumprobiert bis es funktioniert. Statt zu verstehen wie etwas funktioniert und es dann zielgerichtet anzuwenden? Wie würdest Du diesen Umstand denn formulieren?
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Na na, nun schlagt euch nicht :wink: Problem ist, dass all mein Wissen, war aber auch da nicht tiefgreifend, in den letzten Jahren vor Schütt gegangen ist. Bin mittlerweile doch schon um einiges weitergekommen, weiter als ich je war.

Und wenn man weder mit der Doku, noch der help(modul) oder Einsicht in ein Modul weiterkommt, dann wird probiert bis es geht. Nicht sehr schnell aber trotzdem effektiv. Das vergisst man so schnell nicht. Ich denke, ich weiß schon wann es gefährlich wird. Dann lasse ich es lieber bleiben.

Und Google kann mir auch nicht weiterhelfen, wenn ich nicht weiß wonach ich suchen soll.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Und wenn man weder mit der Doku, noch der help(modul) oder Einsicht in ein Modul weiterkommt, dann wird probiert bis es geht.
Also wenn man englische Suchbegriffe verwendet und der Suche noch `python` voranstellt, liefert Google in der Regel gute Treffer, wenn das Problem nicht total exotisch ist. Die ersten Treffer sind in der Regel die offizielle Doku und Threads bei Stack Overflow.

Das Problem bei "Raten statt Programmieren" ist ja, dass vielleicht was lauffähiges dabei raus kommt, aber das ist dann in der Regel weder "schön" noch robust noch sonst irgendwas. Ausserdem hilft es ja auch immer, wenn man am Ende versteht, was man sich da zusammen gehackt hat :-)

Gruß, noisefloor
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

noisefloor hat geschrieben:Also wenn man englische Suchbegriffe verwendet und der Suche noch `python` voranstellt, liefert Google in der Regel gute Treffer
Richtig. Aber wenn du den Begriff nicht kennst, dann hilft auch Google nicht weiter. Grundkenntnisse müssen da sein.
noisefloor hat geschrieben:Ausserdem hilft es ja auch immer, wenn man am Ende versteht, was man sich da zusammen gehackt hat
Genau das ist der Punkt. Programmieren ist für mich auch immer lernen. Ich weiß was ich als Ergebnis haben will, also arbeite ich auf das Ziel hin. Und wenn das Programm mir an irgendeiner Ecke missfällt, z.B. mangelnde Stabilität, dann arbeite ich daran, es zu verbessern.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Richtig. Aber wenn du den Begriff nicht kennst, dann hilft auch Google nicht weiter. Grundkenntnisse müssen da sein.
.
Na ja... aber wenn du dein Problem nicht beschreiben kannst, dann hast du nicht ein, sondern zwei Probleme ;-)

Gruß, noisefloor
Antworten