Exit Sub (erweitert)

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Exit Sub (erweitert)

    Hallo,

    ich bin hier noch ganz neu, das ist meine erste Frage in diesem Forum.
    Aber ich kenne VB-Paradise natürlich schon länger :D

    Ich arbeite gerade an einem Programm, dass sehr viele Subs enthält, die nacheinander aus einer Sub heraus aufgerufen werden.

    Hier ein kleines Beispiel:

    VB.NET-Quellcode

    1. Sub sub1()
    2. MsgBox("1")
    3. MsgBox("2")
    4. sub2()
    5. sub3()
    6. End Sub
    7. Sub sub2()
    8. MsgBox("3")
    9. ' Hier unterbrechen!
    10. MsgBox("4")
    11. End Sub
    12. Sub sub3()
    13. MsgBox("5")
    14. MsgBox("6")
    15. End Sub


    In sub2 bei "Hier unterbrechen" möchte ich zum einen die sub2 beenden (Exit Sub) und zum anderen aber auch verhindern, dass sub3 geöffnet wird.

    Ich habe schon recherchiert, bin aber zu keiner Lösung gekommen.
    Globale Variable setzten, dass abgebrochen wurde und vorm ausführen von sub3 diese prüfen.

    Oder statt Sub-Methoden die Funktionen und deren Return-Value nutzen: True => Vollständig durchgelaufen, False => Abgebrochen und entsprechend danach handeln.
    Vielen Dank für die schnelle Antwort!

    Ich hatte gehofft, man könnte durch "Stop" oder so einfach alles danach beenden.

    Weil das geht sicher an die 100 Subs und dann 100 Mal prüfen ob's geklappt hat...

    Gibt es wirklich keine Alternative?
    Ja, klar. Danke :D
    Warum nicht grad End?

    Nein, es soll einfach die Abfolge unterbrochen/gestoppt werden.
    Im Beispiel soll einfach nach der 3. MessageBox Schluss sein.
    Das Fenster soll offen bleiben und wenn ich nochmal die sub1 aufrufe, soll es wieder von vorne los gehen.
    Naja, dann musst halt prüfen vorm Aufruf. Eine aufgerufene Sub kann ja nicht an die aufrufende Sub was mitteilen dass sie auch beendet werden soll. Wenn du sowas willst, nutze vlt. eher ein Thread, weil den kannste dann an jeder Stelle beenden. Was quasie Applikation.Exit() entspricht, da aber ein extra Thread genutzt wird, bleibt die Hauptanwendung offen.

    Aber Btw. vlt. sollte mal das Code-Konzept überdacht werden. 100 Subs, da kräuseln sich ja ein die Fussnägel hoch wenn man das hört.
    Das erscheint mir jetzt die einfachste Lösung zu sein.
    Wie dodo schon gesagt hat, eine globale Variable setzten und dann prüfen.

    VB.NET-Quellcode

    1. Public ende As Double = 0
    2. Sub sub1()
    3. MsgBox("1")
    4. MsgBox("2")
    5. sub2()
    6. If ende = 1 Then : ende = 0 : Exit Sub : End If
    7. sub3()
    8. If ende = 1 Then : ende = 0 : Exit Sub : End If
    9. sub4()
    10. If ende = 1 Then : ende = 0 : Exit Sub : End If
    11. sub5()
    12. If ende = 1 Then : ende = 0 : Exit Sub : End If
    13. sub6()
    14. (...)
    15. End Sub
    16. Sub sub2()
    17. MsgBox("3")
    18. ende = 1
    19. Exit Sub
    20. MsgBox("4")
    21. End Sub
    22. Sub sub3() 'sub4(), sub5(), sub6(),...
    23. MsgBox("5")
    24. MsgBox("6")
    25. End Sub
    Also du hast definitiv einen Design Fehler.
    Abgesehen davon Kannst dir die restlichen Ifs sparen da diese nie angekickt werden, wenn deine "ende" Variable 1 hat.
    Abgesehen davon nimm keinen Double als Datentyp wenn du nur 2 Zustände darstellen willst. Hierfür gibt es eigens einen -> Boolean welcher nur False/True kann.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Mir ist schon bewusst, dass das Beispiel, so wie es ist, keinen Sinn macht.

    Später in meinem Programm wird ende = 1 nur, wenn ein Fehler aufgedrehten ist.
    Die einzelnen Funktionen in den Subs sind aber sehr komplex und werden mehrfach benötigt, immer in einer anderen Reihenfolge.
    Somit erreiche ich einen halbwegs kurzen, übersichtlichen und sehr stabilen Code.

    Du kannst mir glauben, dass in meinem Fall der beste Weg die Einteilung in viele Subs ist :)

    Aber vielen Dank für die Tipps, vor allem schon nach so kurzer Zeit!
    Du hast definitiv einen DesignFehler.
    Deine Subs sollen eine Information zurückgeben, nämlich, ob die übergeordnete Sub abbrechen soll. Subs, die eine Information zurückgeben, nennt man Function.
    Functions, die als Bool zurückgeben, ob sie iwas mit erfolg durchgeführt haben, bename ich immer mit TryXY.

    nu gugge diese:

    VB.NET-Quellcode

    1. Private Sub SubFuerAlle()
    2. If Try1() Then Return
    3. If Try2() Then Return
    4. If Try3() Then Return
    5. If Try4() Then Return
    6. If Try5() Then Return
    7. If Try6() Then Return
    8. If Try7() Then Return
    9. End Sub
    10. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    11. Private Function Try1() As Boolean
    12. '...
    13. End Function
    14. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    15. Private Function Try2() As Boolean
    16. '...
    17. End Function
    18. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    19. Private Function Try3() As Boolean
    20. '...
    21. End Function
    22. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    23. Private Function Try4() As Boolean
    24. '...
    25. Return True
    26. End Function
    27. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    28. Private Function Try5() As Boolean
    29. '...
    30. End Function
    31. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    32. Private Function Try6() As Boolean
    33. '...
    34. End Function
    35. ''' <summary> versucht irgendwas, und gibt zurück, obs erfolgreich war </summary>
    36. Private Function Try7() As Boolean
    37. '...
    38. End Function
    39. Private Sub NochKnappereSubFuerAlle()
    40. Dim success = Try1() OrElse Try2() OrElse Try3() OrElse Try4() OrElse Try5() OrElse Try6() OrElse Try7()
    41. End Sub
    Da die Lösung mit den Subs ja eh völlig unsbauer ist und somit auf guten übersichtlichen Codestil kein Wert gelegt wird, ist mir noch eine andere Lösung eingefallen die wohl auch einfach um zu setzten ist

    VB.NET-Quellcode

    1. Sub1()
    2. Try
    3. Sub2()
    4. Sub3()
    5. Sub4()
    6. Sub5()
    7. Catch e As Exception
    8. MsgBox("In Sub abgebrochen ": & ex.Message)
    9. End Try
    10. End Sub
    11. Sub2()
    12. ' irgend ein Code, bei einem Fehler
    13. Throw New Exception("Sub2")
    14. End Sub
    15. Sub3()
    16. ' irgend ein Code, bei einem Fehler
    17. Throw New Exception("Sub3")
    18. End Sub