| 

.NET C# Java Javascript Exception

2
Hallo,

folgende Situation habe ich: die Mainform ruft eine Form2 auf. In Form2 habe ich folgende Situation (mit Pseudocode):

Private Sub sub1()
Call sub2()
Hiergehtsweiter
End Sub

Private Sub sub2()
Try
Datenbankabfrage
Catch e As Exception
Me.Close
Me.Dispose
End Try
End Sub

Mein Problem dabei ist, dass er zwar die Anweisungen im Catch-Block ausführt, aber er macht einfach in sub1 bei "Hiergehtsweiter" weiter. Ich möchte aber bei einem Fehler das Formular (nicht Application.Exit(), das Mainform soll weiter laufen!) sofort schließen. Ich habe ziemlich vieles probiert, mit einer lokalen Fehlervariable, nur mit Me.Close, nur mit Me.Dispose, auch mit MyBase.Dispose, alles ohne Auswirkungen.

Wie kann ich das Formular sofort beenden?
News:
18.12.2012
muffi 1,4k 1 9
Ich hab derlei noch nicht in VB.Net benötigt von daher poste ich das lieber als Kommentar denn als Antwort:
Bestünde die Möglichkeit, dass "sub2" einen boolschen Wert zurückgibt, der über den weiteren Verlauf bestimmt? Warum Me.Dispose danach den Code weiterlaufen lässt, verwundert mich zwar auch ein klein wenig, kommt mir aber auch aus C# bekannt vor :S sicher bin ich leider aber auch nicht ^^

so far
Karill Endusa
Karill Endusa 18.12.2012
Den Workaround habe ich auch getestet gehabt (If sub2() = True Then Exit Sub). Das funktioniert zwar, ist aber wohl nur ein Workaround.
muffi 18.12.2012
3 Antworten
0
Liefer doch einfach in sub2 ein bool zurück ob der Aufruf geklappt hat oder nicht. Bei sub1 wird dann nur weitergemacht wenn true zurückgeliefert wurde.
18.12.2012
PinBack 687 1 8
hey klau mir nich meinen Kommentar um daraus ne Antwort zu machen :P
Karill Endusa 18.12.2012
Wie gesagt, den Workaround habe ich auch versucht. Funktioniert zwar, aber gefällt mir nicht so wirklich.
muffi 18.12.2012
Sorry Karill ... du warst etwas schneller als ich
PinBack 18.12.2012
Ich sehe das eigentlich nicht als Workaround. Du könntest natürlich auch ein spez. Exception in sub2 werfen, in sub1 darauf reagieren und dort die Form schliessen.
PinBack 18.12.2012
0
Neben dem booleschen Wert könnte auch folgender Ansatz funktioniren:
Private Sub sub1()
Try
Call sub2()
Hiergehtsweiter
Catch ex As Exception
End Try
End Sub

Private Sub sub2()
Try
Datenbankabfrage
Catch e As Exception
Me.Close
Throw e
End Try
End Sub

Die Ausnahme kann noch einmal ausgelöst werden und in einer weiteren Funktion (hier sub1)gefangen werden. Me.Dispose macht wenig Sinn, da das Objekt über sub1() gehalten wird. Die Funktion sub1 wird dann bei der ersten Ausnahme verlassen.
18.12.2012
edvservice 1,2k 6
Getestet, funktioniert zwar auch (im Catch des Sub1 einfach Exit Sub), aber da gefällt mir die Version mit Funktion statt Sub eindeutig besser (weil es ein schöner Einzeiler ist).
muffi 18.12.2012
0
Eine andere Möglichkeit wäre es, die Exceptionbehandlung aus sub2() zu eliminieren und in sub1() zu implementieren.

Private Sub sub1()
Try
Call sub2()
Hiergehtsweiter
Catch ex As Exception
Me.Close
End Try
End Sub

Private Sub sub2()
Datenbankabfrage
End Sub

Ansonsten ist die Version mit dem Rückgabewert zwingend notwendig. Me.Close schließt nur das Formular (d.h. es wird nicht mehr auf dem Bildschirm angezeigt). Me.Dispose gibt nur Resourcen frei damit der Garbage Collector bei Bedarf den Speicher des Formulars freigeben. Der Ablauf im Code wird dadurch nicht unterbrochen.

Wenn allerdings sub1() wiederum Teil einer Aufrufhierarchie ist, muss die Fehlerbehandlung weiter oben erfolgen.

Am sichersten wäre es aus meiner Sicht die Exceptionbehandlung aus dem Unterformular zu entfernen und die Exception im aufrufenden Formular abzufangen. Dann ist sichergestellt, dass der Code im Unteformular nicht weiter ausgeführt wird.
19.12.2012
luedi 1,9k 1 9
Fast in die Richtung geht der Weg, den ich im Moment habe. Die sub2 ist bei mir immer noch eine Funktion geblieben. Wie ich es an edvservice schon angedeutet habe, ich würge in sub1 mittels Exit Sub die Ausführung ab, wenn sub2 den Fehler zurück gibt. Auch, wenn ich Deinen Workaround gut finde, lass ich das vorerst mal so - schließlich folge ich damit meiner einheitlichen Linie in dem Projekt. Schade, dass es kein Exit Form gibt ;-)
muffi 19.12.2012

Stelle deine .net-Frage jetzt!