| 

.NET C# Java Javascript Exception

2
Ich hatte heute folgenden Code:

int id;
public int Id
{
get { return Id; }
}


Wer sieht den Fehler? Ich habe extrem lange gebraucht, bis ich gemerkt habe, dass die Id-Eigenschaft sich im getter selber aufruft. Dadurch gibt es einen Stackoverflow bzw. StackoverflowException.
Ich habe das aber nicht gemerkt, weil der Debugger sofort ausgegangen ist, wenn ich die Zeile ausgeführt habe. Genauer gesagt, ist sogar der ganze Webserver-Prozess ausgegangen ohne jede Meldung. Bei anderen Exceptions passiert das nicht. Hat jemand eine Idee, wieso eine StackoverflowException den Prozess sofort terminiert?
20.08.2009
psola 41 1 2
3 Antworten
3
Eine StackoverflowException, also ein Überlauf des Verarbeitungsstapels, ist eine sehr ernste Angelegenheit. Einfach gesagt, weiß die Anwendung nicht mehr wo sie steht.
Die Doku zur StackoverflowException sagt auch eindeutig:
Ab .NET Framework, Version 2.0, kann ein StackOverflowException-Objekt nicht mehr durch einen try-catch-Block abgefangen werden, und der zugehörige Prozess wird standardmäßig beendet.
Nachzulesen hier in der MSDN.

Servus,
Klaus
21.08.2009
klaus_b 1,6k 3 7
Hm ok. Warum wird das denn gemacht?
psola 21.08.2009
Du meinst, warum der Prozess angebrochen wird?
klaus_b 21.08.2009
1
Du must dir die Verarbeitung eines Prozess wie einen Stapel aus Klötzen vorstellen.
Ein Anweisung irgend etwas zu tun kommt oben auf den Stapel. In deinem Fall war es: Gib den Wert einer Variablen zurück.
Jetzt versucht der ausführende Prozess diese Anweisung auszuführen. Im Normalfall wie die Anweisung ausgeführt und der "Klotz" wird vom Stapel genommen. In deinem Fall wurde immer wenn die Anweisung ausgeführt wurde anstatt den Klotz vom Stapel zu nehmen, ein neuer oben drauf gelegt. Der Prozess konnte nie einen Stapel entfernen und der Stapel wurde immer größer. Damit gerät der Prozess in einen instabielen Zustand und ist nicht mehr steuerbar. Was soll das System jetzt noch machen?
Richtig, der Prozess wird beendet damit das System in einem stabilen Zustand verbleibt.

Ich hoffe ich konnte dir die Problematik ein wenig näher bringen.

Servus,
Klaus
21.08.2009
klaus_b 1,6k 3 7
0
Die CLR kann von anderen Porzessen gehostet werden. ASP.NET ist ein Host, genau wie SQL-Server. Der Host kann entscheiden, was mit einer Exception gemacht wird. Aus Verlässlichkeitsgründen befehlen ASP.NET und SQL-Server, im Falle einer kritischen Exception wie OutOfMemory oder Stackoverflow die AppDomain zu entladen. Die Anwendung könnte mir dieser Exception überfordert sein und ihr interner Zustand könnte kaputt sein. Das kann ein Sicherheitsrisiko werden.

Aus demselben Grund gibt es bei jeder Kernel-Exception sofort einen Blue-Screen.
21.08.2009
Serda 455 2 7

Stelle deine Framework-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH