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?
Fehler in Extension abfangen.
-
- User
- Beiträge: 25
- Registriert: Mittwoch 24. August 2005, 14:29
- Wohnort: Buchenau/Hessen
- Kontaktdaten:
[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]
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
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...Nein, zumindest keine einfache.
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
--- Heiko.
Nana...modelnine hat geschrieben:Nein, es gibt keine Möglichkeit so einen Fehler abzufangen, egal wie sehr Du Dich anstrengst
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.
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
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.?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.
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.