Throw New Exception wird nicht behandelt

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Throw New Exception wird nicht behandelt

    Hallo,

    ich habe eine Funktion aus dem Web, welche mir eine csv Datei in ein Datagridview einfügen soll. Dies funktioniert ohne Probleme, nur die Ausnahmebehandlung macht mir Ärger.

    Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim fName As String = ""
    3. OpenFileDialog1.InitialDirectory = "d:\"
    4. OpenFileDialog1.Filter = "CSV files(*.csv)|*.csv | TXT files(*.txt)| *.txt"
    5. OpenFileDialog1.FilterIndex = 2
    6. OpenFileDialog1.RestoreDirectory = True
    7. If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
    8. fName = OpenFileDialog1.FileName
    9. End If
    10. TextBox1.Text = fName
    11. DataGridView1.DataSource = FileToTable(fName, {vbTab}, False)
    12. End Sub
    13. Public Shared Function FileToTable(ByVal fileName As String, ByVal separator As String(), isFirstRowHeader As Boolean) As DataTable
    14. Dim result As DataTable = Nothing
    15. ' Dim dt As New System.Data.DataTable
    16. Try
    17. If Not System.IO.File.Exists(fileName) Then Throw New ArgumentException("fileName", String.Format("The file does not exist : {0}", fileName))
    18. Dim dt As New System.Data.DataTable
    19. Dim isFirstLine As Boolean = True
    20. Using sr As New System.IO.StreamReader(fileName)
    21. While Not sr.EndOfStream
    22. Dim data() As String = sr.ReadLine.Split(separator, StringSplitOptions.None)
    23. If isFirstLine Then
    24. If isFirstRowHeader Then
    25. For Each columnName As String In data
    26. dt.Columns.Add(New DataColumn(columnName, GetType(String)))
    27. Next
    28. isFirstLine = True ' Signal that this row is NOT to be considered as data.
    29. Else
    30. For i As Integer = 1 To data.Length
    31. dt.Columns.Add(New DataColumn(String.Format("Column_{0}", i), GetType(String)))
    32. Next
    33. isFirstLine = False ' Signal that this row IS to be considered as data.
    34. End If
    35. End If
    36. If Not isFirstLine Then
    37. dt.Rows.Add(data.ToArray)
    38. End If
    39. isFirstLine = False ' All subsequent lines shall be considered as data.
    40. result = dt.Copy
    41. End While
    42. End Using
    43. Catch ex As Exception
    44. Throw New Exception(String.Format("{0}.CSVToDatatable Error", GetType(System.Windows.Documents.Table).FullName), ex)
    45. Return Nothing
    46. End Try
    47. Return result
    48. End Function


    Wenn ich beim "OpenFileDialog" keine Datei auswähle oder ich auf Abrechen drücke bleibt VisualStudio immer bei "Throw New Exception(String.Format("{0}.CSVToDatatable Error", GetType(System.Windows.Documents.Table).FullName), ex)" hängen und gibt mir an das die Exception nicht behandelt wurde.

    Was kann ich tun?

    Danke und Gruß

    Pippsen schrieb:

    Wenn ich beim "OpenFileDialog" keine Datei auswähle oder ich auf Abrechen drücke bleibt VisualStudio


    Wieso lässt du denn dann überhaupt zu das du dann die Funktion aufrufst?

    Ich würde ja eher so machen:

    VB.NET-Quellcode

    1. If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
    2. fName = OpenFileDialog1.FileName
    3. TextBox1.Text = fName
    4. DataGridView1.DataSource = FileToTable(fName, {vbTab}, False)
    5. End If


    So kann es ja gar nicht passieren das die Funktion startet wenn man Abbrechen drückt.
    Dann könntest du noch vorher mit String.IsNullOrEmpty checken ob der FileName Empty ist.

    Und erst wenn alles ok ist: also filename ist nicht empty. Es wurde OK gedrückt und nicht abbrechen erst dann würde ich alles übergeben.
    Und das Try-Catch halte ich an sich nicht für sinnvoll
    TryCatch ist ein heißes Eisen
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    Pippsen schrieb:

    ich habe eine Funktion aus dem Web
    Ich hoffe, Du hast gelernt, dass jede Zeile fremden Codes explizit überprüft werden muss, wenn Du sie in Dein Projekt einfügst.
    Rufe modale Dialoge besser mit der inversen Logik auf:

    VB.NET-Quellcode

    1. If (OpenFileDialog1.ShowDialog() <> DialogResult.OK) Then
    2. Return
    3. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich versteh das Problem nicht. Der Code macht doch, was Du willst. Wenn die Datei nicht gefunden wird, dann (Zeile#48) wirf eine neue Exception in den Raum. Das Programm macht also genau das, was Du da in Dein Projekt reinkopiert hast - wohl ohne genau zu wissen, was der Code macht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    das ich den Code überprüfen muss ist mir bewusst und das was der Code macht versuche ich mir natürlich auch selber zu erklären. Nur nach 2 Tage Google, Foren und MSDN usw. bin ich eben nicht darauf gekommen warum er den Fehler im Bild bringt... Hoffe das mir das hier jemand erklären kann.

    Danke
    Bilder
    • Unbenannt.JPG

      118,96 kB, 1.450×477, 70 mal angesehen
    Nochemal: Du fängst einen Fehler ab und wirfst daraufhin eine neue Ex in den Raum. Da Du diese aber nicht behandelst, stoppt der Compiler hier.
    Du könntest innerhalb des Catch-Bereiches einen neuen Try-Catch-Block machen. Im Try-Bereich die von Dir markierte Zeile, im Catch-Bereich kommt dann das, was gemacht werden soll, wenn diese Exception kommt. Aber das Ganze ergibt alles nur Sinn, wenn der erste Try-Catch-Block überhaupt sinnvoll ist. Wirf das ganze Try-Catch-Zeugsl raus und macht ein einfaches If-Statement zum Anfang der Prozedur, das prüft, ob die Datei existiert. Wenn sie nicht existiert, dann verlasse die Prozedur. Kein Try, kein Catch, keine Exception, kein Exception-Rethrow.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Pippsen schrieb:

    VB.NET-Quellcode

    1. If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
    2. fName = OpenFileDialog1.FileName
    3. Else ' das ist mein Code
    4. fName = "Roulade mit Klößen" ' das ist auch mein Code
    5. End If
    6. TextBox1.Text = fName
    Wenn der Dialog mit Escape abgebrochen wird, machst Du munter weiter mit einer nicht initialisierten Variablen fName.
    In meiner Ergänzung wird die nicht initialisierte Variable mit einem Dummy-String beschrieben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Pippsen Ich möchte nochmal konkretisieren:

    Pippsen schrieb:

    bleibt VisualStudio immer bei "Throw New Exception..." hängen und gibt mir an das die Exception nicht behandelt wurde.

    Wie @VaporiZed bereits erwähnte,stoppt die Programmausführung an der Stelle, damit du als Programmierer mitbekommst, dass in deinem Programm noch unbehandelte Exceptions auftreten.

    Das darf nicht sein
    .

    Unbehandelte Exceptions müssen um jeden Preis vermieden werden, und sie einfach weg try-catchen ist keine Option. Genausowenig sollte der User mit den generischen Windowsmeldungen konfrontiert werden, vor allem, wenn Windows dem User die Möglichkeit gibt die Exception einfach zu ignorieren. Dann befindet sich dein Programm in einem zumeist unbekanntem, und oft auch unerwüschtem Zustand, der zu allenmöglichen Problemen führen kann.

    Das VS bei Exceptions anhält ist für dich ein Tool um zu verstehen, was schiefgelaufen ist und in welchem Zustzand sich die Anwendung gerade befindet (Mit der Maus mal über Variablen Hovern, wenn das wieder auftritt). Daraus kannst du dann oft schlussfolgern, warum es zu der Exception kam, und den Code so umschreiben, dass es erst gar nicht zu der Exception kommt. Sollte trotz allem nicht klar sein, wieso die Exception fliegt, beginnst du nun mit dem debugging (wofür ich leider gerade nicht den Link zur Hand habe), bei dem du Breakpoints setzt, dir deine Variablen ansiehst, und Schritt für Schritt durch den Code steppst, bis du herausgefunden hast, was zur Exception führt.
    @Pippsen Du diskutierst über sekundäre Fehler ohne die primäre Ursache (das Abbrechen des Dialogs) verstanden zu haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!