Announcement

Collapse
No announcement yet.

try...catch und me.close

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • try...catch und me.close

    Halloechen,

    wieso wird das im catch-Block stehende me.close nicht behandelt?
    Hab ich irgendetwas uebersehen?

    Denn eigentlich sollte er bei klick auf No oder Cancel eine msgbox praesentieren und anschliessend das Programm beenden.

    [highlight=vbnet]
    Public Sub prv_read_lst()
    Try
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLiteCommand
    SQLconnect.ConnectionString = "Data Source=" & fullpathDB & ";"
    SQLconnect.Open()
    SQLcommand = SQLconnect.CreateCommand
    SQLcommand.CommandText = "SELECT * FROM realms"
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
    lst_records.Items.Clear()
    While SQLreader.Read()
    lst_records.Items.Add(String.Format("ID = {0}, Name = {1}, Description = {2}, Group = {3}, Address = {4}", SQLreader("id"), SQLreader("realm_name"), SQLreader("realm_desc"), SQLreader("realm_group"), SQLreader("realm_address")))
    End While
    SQLcommand.Dispose()
    SQLconnect.Close()

    Catch ex_readtable As SQLiteException

    'Dim question_create As String
    Dim response As MsgBoxResult

    '"When this is not your first start of the program it would be nice when you could inform me about the error"

    '
    response = MsgBox("Is this your first time you run this program?" & vbCrLf & "Then we have to create a databasefile first. CLick [Yes] therefor", vbYesNoCancel)

    If response = MsgBoxResult.Yes Then

    MsgBox("create")
    prv_createtable()

    ElseIf response = MsgBoxResult.No Then

    MsgBox("An error occured:" & vbCrLf & ex_readtable.Message & vbCrLf)
    Me.Close()

    ElseIf response = MsgBoxResult.Cancel Then

    Me.Close()

    End If


    End Try
    End Sub[/highlight]

  • #2
    Hallo,

    wenn keine Ausnahme (Exception) auftritt wird das catch auch nicht ausgeführt.

    BTW: try-catch sollte nicht zur Ablaufsteuerung sondern nur zur Ausanhmenbehandlung verwendet werden.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Die Exception tritt aber auf, weil
      [highlight=vbnet]SQLcommand.CommandText = "SELECT * FROM realms"[/highlight]
      auf eine nicht vorhandene Tabelle zugreifen will.

      Dass diese Exeption auftritt, bestaetigt ja die Anzeige der msgbox.

      Comment


      • #4
        Also ... bin mal via Einzelschritt durchgegangen ..

        Vllt. haette ich auch vorher sagen sollen, dass die Funktion ueber MyApplication_Startup aufgerufen wird.

        Also .. Ablauf ist folgender:
        MyApplication_Startup ruft Funktion auf. [My.Forms.Form1.pub_read_lst()]
        Dort wird festgestellt, dass in der SQL-DB keine Tabelle 'realms' vorhanden ist und eine Exception ausgeloest.

        Im Catch-Block landet er auch und er wertet auch Yes/No/Cancel aus ...
        allerdings uebergeht er einfach Me.Close() und wandert wieder zu MyApplication_Startup ...

        sollte ich da eher Reuckgabewerte an dsa Event geben und aus dem Event heraus das Programm schliessen?

        Comment


        • #5
          hmpf ...

          vielleicht sollte ich nicht mit den Programmweiten Startup-Event arbeiten, sondern mit Form1_load ...

          Das schliessen des Programmes funktioniert naemlich, wenn ich

          [highlight=vbnet]
          Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          pub_read_lst()
          End Sub
          [/highlight]

          in der Form1.vb anstatt

          [highlight=vbnet]
          Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupE ventArgs) Handles Me.Startup

          My.Forms.Form1.pub_read_lst()
          Form1.Close()

          End Sub
          [/highlight]

          in der ApplicationEvents.vb nutze.

          Als weiteren Vorteil kann ich pub_read_lst() wieder als Private deklarieren

          Comment


          • #6
            Der größte Vorteil wäre, den Prüfcode aus dem Try/Catch zu entfernen. Wie schon gesagt, man schmeisst keine Exception oder nutzt das zur Ablaufsteuerung
            Christian

            Comment


            • #7
              Ja gut ... das wuerde bedeuten, dass ich anstatt des Pruefcode einzelne Subs/Functions aufrufe ... wo dann der Pruefcode ausgefuehrt wird.

              Ich finde es zwar sehr gut, dass ihr mir sagt, dass ich dies tun soll.
              Aber was spricht denn gegen den Pruefungen im Catch-Block?

              Bin halt noch neu in VB/.NET und komme eher aus der strukturellen Programmierung, wo alles ein bisschen anders laeuft.
              Da hab ich mich um Ausnahmen immer selbst gekuemmert
              Zuletzt editiert von stderr; 04.09.2010, 18:10. Reason: Buchwechselverstaber

              Comment


              • #8
                Spricht eigentlich etwas gegen verschachtelte Try...Catch-Bloecke?

                [highlight=vbnet]

                Try
                SQLconnect.ConnectionString = "Data Source=" & fullpathDB & ";"
                SQLconnect.Open()
                SQLcommand_createtable = SQLconnect.CreateCommand
                SQLcommand_createtable.CommandText = "CREATE TABLE realms(id INTEGER PRIMARY KEY AUTOINCREMENT, realm_name TEXT, realm_desc TEXT, realm_group TEXT, realm_address TEXT);"

                Try
                SQLcommand_createtable.ExecuteNonQuery()
                Catch ex_createtable As SQLiteException
                createsuccess = False
                End Try


                SQLcommand_createtable.Dispose()
                SQLconnect.Close()

                createsuccess = True

                Catch ex_createDB As SQLiteException

                MsgBox(ex_createDB.Message)
                createsuccess = False

                End Try
                [/highlight]

                Comment

                Working...
                X