Fehler in Extension abfangen.

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
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

Donnerstag 30. März 2006, 18:02

Guten Abend allerseits,

ich habe schon oft das Problem gehabt das der Pythoninterpreter von Windows beendet werden musste, weil irgendetwas in einer Extension nicht sauber verarbeitet wurde. Sprich: Windows teilte mir mit das ein read von pythinw.exe auf eine Stelle im Speicher verweist die nicht existiert oder es kam einfach die Meldung "pythonw.exe hat ein Problem festgestellt und muss beendet werden".

Gibt es irgendeine Möglichkeit solch einen schwerwiegenden Fehler innerhalb meines Pythoncodes abzufangen bzw. es einfach zu ignorieren wenn die Extension Mist baut?
[url=http://therealzordak.de/index.php]therealzordak.de[/url] - [url=http://therealzordak.de/index.php?section=movies]Movies[/url] - [url=http://therealzordak.de/index.php?section=derwahn]Fun[/url]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 30. März 2006, 18:29

Nein, zumindest keine einfache.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Donnerstag 30. März 2006, 23:33

Nein, zumindest keine einfache.
Das ist sehr euphemistisch gesagt. Nein, es gibt keine Möglichkeit so einen Fehler abzufangen, egal wie sehr Du Dich anstrengst, denn der Code der den Fehler wirft hat wahrscheinlich schon mit Python-Interna rumgemuckelt, so dass der Zustand des Python-Interpreters nicht mehr konsistent ist. Ich erinnere zum Beispiel an teil-initialisierte Tupel, oder ähnliches. In so einer Situation will man, egal wie sehr man sich anstrengt, nicht weitermachen, sondern den Code der den Fehler verursacht fixen...

Ich erinner mich an jemanden der vor einiger Zeit auf der python-ML gepostet hatte, und sowas machen wollte um den Segfault eines seiner eigenen Extensions abzufangen:

Code: Alles auswählen

try:
    <blah>
except Segfault:
    pass
Selten so gelacht, zumal er nicht einsichtig war dass es schlicht und ergreifend sinnlos ist sowas zu tun.
--- Heiko.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 30. März 2006, 23:50

modelnine hat geschrieben:Nein, es gibt keine Möglichkeit so einen Fehler abzufangen, egal wie sehr Du Dich anstrengst
Nana...

C-Extensionmodul schreiben, dass den Interpreter nochmals startet, auf SIGSEGV reagiert, einen Stackbacktrace macht, diesen analysiert, den Stack entsprechend ändert, dass problemlos an die Hauptschleife zurückgesprungen wird (so denn nicht wild in den Interpreterstrrukturen rumgeschrieben wurde), und dann eine vorher definierte Pythonfunktion angesprungen wird.

So würde ich es machen, wenn ich gezwungen wäre, sowas zu implementieren. Mit "gezwungen" meine ich jetzt "Waffe an der Schläfe", alles darunter würde die Arbeit nicht rechtfertigen.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Freitag 31. März 2006, 05:57

C-Extensionmodul schreiben, dass den Interpreter nochmals startet, auf SIGSEGV reagiert, einen Stackbacktrace macht, diesen analysiert, den Stack entsprechend ändert, dass problemlos an die Hauptschleife zurückgesprungen wird (so denn nicht wild in den Interpreterstrrukturen rumgeschrieben wurde), und dann eine vorher definierte Pythonfunktion angesprungen wird.
Wie willst Du den Rückgabewert der Extension in den aufrufenden Prozess kriegen? Sobald Du diesen Weg gehst brauchst Du Prozessseparierung (iiih, drei s), denn sonst könnte das Modul was den Segfault produziert auch den Interpreter den Du schützen willst in Mitleidenschaft ziehen. Okay, wäre wahrscheinlich nicht mal so schwer zu lösen (je nach Daten die zwischen Prozessen wandern müssen), nur was machst Du mit Referenzen vor/nach einem Segfault, usw.?

Lustige Probleme, für die's schlicht keine vernünftige (zumindest allgemeine) Antwort gibt. Deswegen hatte ich auch mehr oder weniger geschrieben dass man sowas auf keinen Fall machen will. ;-)
--- Heiko.
Antworten