Warum greift Try-Catch nicht?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Warum greift Try-Catch nicht?

    Moin!

    ich habe nachfolgende Funktion in der für Test absichtlich ein Fehler enthalten ist:

    VB.NET-Quellcode

    1. Public Function GetEnv(ByVal Key As String, Optional ByRef Log As EBL.Service.Log = Nothing) As Tuple(Of Boolean, String)
    2. Dim Status As Boolean = True
    3. 'Todo: Add Fehlerrückgabe
    4. ' ------ ------
    5. Dim pref As Object = Application.Preferences
    6. Dim Value As String = ""
    7. ' Plotter - https://forums.autodesk.com/t5/net/setting-autocad-file-paths-in-vb-net/td-p/2248365
    8. Try
    9. Select Case Key.ToUpper
    10. Case "ACAD"
    11. Value = pref.Files.SupportPath
    12. Case "TEMPLATEPATH"
    13. Value = pref.Files.TemplateDwgPath
    14. Case "QNEWTEMPLATE"
    15. pref.Files.QnewTemplate = Value
    16. Case Else
    17. If Not IsNothing(Log) Then
    18. Log.WriteAsError("Ungültiger Name für eine Systemvariable '" & Key & "'")
    19. End If
    20. Status = False
    21. End Select
    22. Catch ex As Exception
    23. If Not IsNothing(Log) Then
    24. If ex.ToString.ToUpper.IndexOf("Der öffentliche Member " & Key & " für den Typ IAcadPreferencesFiles wurde nicht gefunden.".ToUpper) > -1 Then
    25. Log.WriteAsError("Unbekannte Umgebungsvariablen '" & Key & "' konnte nicht gelesen werden!")
    26. Else
    27. Log.WriteAsError("Fehler beim Lesen der Umgebungsvariablen '" & Key & "'!" & vbCrLf & _
    28. "Value:= " & Value & vbCrLf & ex.ToString)
    29. End If
    30. End If
    31. Status = False
    32. End Try
    33. Return Tuple.Create(Status, Value)
    34. End Function


    In der Zeile 17 kommt es zum Fehler und anstatt in den Catch-Bereich zu springen kommt die Fehlermeldung erst in dem Try-Catch der aufrufenden Funktion.

    Kann mir das einer von Euch erklären?

    Gruß Jan
    Wird denn Zeile#17 100%ig in dem Fall erreicht? Wie lautet denn die Fehlermeldung und von welchem Typ ist denn die Exception, die kommt? Manche Exces sind durch Try-Catch nicht auffangbar, das durfte ich mit Com-Exceptions mal miterleben.
    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.
    Moin!

    erst einmal vielen Dank.

    Der Debugger kommt zumindest an:



    Die oben zitierte Funktion wird aus einer anderen aufgerufen und die diese Funktion aufrufende Funktion gibt erst die Fehlermeldung aus.

    Hier einmal der Code der "mittleren" Funktion - die aber auch ein try-catch hat.

    VB.NET-Quellcode

    1. Public Sub DefinePathByEnv(ByVal EnvName As String, _
    2. ByVal Bezeichnung As String, _
    3. ByVal SLiteKey As String, _
    4. Optional ByVal IsBlackWhite As Boolean = True)
    5. With Loader._Log
    6. ' Gets the current value of the environment variable
    7. Dim SuchpfadResult As Tuple(Of Boolean, String) = _SrvMisc.GetEnv(EnvName)
    8. If SuchpfadResult.Item1 = False Then
    9. .WriteAsError("Systemvariable '" & EnvName & "' wurde nicht definiert!")
    10. Else
    11. Try
    12. Dim Path As String = SuchpfadResult.Item2
    13. If IsBlackWhite = True Then
    14. Path = CreateListOfDirectory(Bezeichnung, SLiteKey)
    15. Else
    16. Dim SQL As String = "select VALUE from " & k_Konfig_DB_Replacer & " where key ='" & SLiteKey & "'"
    17. Path = GetParameter2UseSingle(SQL).Trim(" ")
    18. End If
    19. If Path.Length > 0 And Not Path = k_Undef_DB_String Then
    20. _SrvMisc.SetEnv(EnvName, Path, Loader._Log)
    21. Dim PR1 As Integer = 25
    22. Dim PR2 As Integer = 25
    23. If IsBlackWhite = False Then
    24. .Write(EnvName.ToUpper.PadRight(PR1, " ") & " " & Path.PadRight(PR2, " ") & " -> OK")
    25. End If
    26. End If
    27. Catch ex As Exception
    28. .WriteAsError("Fehler beim Zuweisen der Systemvariablen '" & EnvName & "'" & vbCrLf & ex.ToString)
    29. End Try
    30. End If
    31. End With
    32. End Sub


    Der Aufruf erfolgt in Zeile 21.

    Das einzige was mich stutzig macht und ein Hinweis sein könnte ist die Tatsache, dass es in der anfangs genannten Funktion keine Autovervollständigung hinter "pref.Files." gibt!!!

    Aber gibt es dann noch einen anderen Trick eine solche Fehlermeldung abzufangen?

    Gruß Jan

    VaporiZed schrieb:

    Wie lautet denn die Fehlermeldung und von welchem Typ ist denn die Exception


    jan99 schrieb:

    Das einzige was mich stutzig macht und ein Hinweis sein könnte ist die Tatsache, dass es in der anfangs genannten Funktion keine Autovervollständigung hinter "pref.Files." gibt!!!
    pref ist vom Typ Object. Klar, dass Dir da IntelliSense nicht weiterhelfen kann.
    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.

    VaporiZed schrieb:

    VaporiZed schrieb:

    Wie lautet denn die Fehlermeldung und von welchem Typ ist denn die Exception


    Sorry, vergessen! War es das was Du meinst:

    System.MissingMemberException:
    Der öffentliche Member QNewTemplate für den Typ IAcadPreferencesFiles wurde
    nicht gefunden.

    bei
    Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateSet(Object o,
    Type& objType, String name, Object[] args, String[] paramnames, Boolean
    OptimisticSet, CallType UseCallType)

    bei
    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Object Instance,
    Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames,
    Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase, CallType
    CallType)

    bei Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSetComplex(Object
    Instance, Type Type, String MemberName, Object[] Arguments, String[]
    ArgumentNames, Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase)

    bei
    EBL.Service.Miscellaneous.GetEnv(String Key, Log& Log) in
    C:\VSProjects\2015\EBL.Service\EBL.Service\cls_Miscellaneous.vb:Zeile 1033.

    bei
    EBL_AcadLoader.DataStore.DefinePathByEnv(String EnvName, String Bezeichnung,
    String SLiteKey, Boolean IsBlackWhite) in C:\VSProjects\2015\EBL_AcadLoader\EBL_AcadLoader\DataStore.vb:Zeile
    790.

    bei
    EBL_AcadLoader.Loader.AcLoader(Boolean HardReset) in
    C:\VSProjects\2015\EBL_AcadLoader\EBL_AcadLoader\Loader.vb:Zeile 156.


    jan99 schrieb:

    Das einzige was mich stutzig macht und ein Hinweis sein könnte ist die Tatsache, dass es in der anfangs genannten Funktion keine Autovervollständigung hinter "pref.Files." gibt!!!
    pref ist vom Typ Object. Klar, dass Dir da IntelliSense nicht weiterhelfen kann.


    Nur so ein Gedanke von einem "unwissenden".

    Jan
    Hallo @jan99!
    Erstmal: Ich hab versucht nachzuvollziehen, was Du mit

    jan99 schrieb:

    Application.Preferences
    meinst. Wenn ich ein neues VB.NET Projekt aufmache und auf System.Windows.Forms.Application die Eigenschaft Preferences zugreifen will, dann bietet mir Intellisense diese Property gar nicht an. Könntest Du bitte beschreiben, was Du gemacht hast um auf diese Property zugreifen zu können?

    Dass nach

    jan99 schrieb:

    keine Autovervollständigung hinter "pref.Files."
    erscheint, wird wohl an der Tatsache liegen, dass Du mit der Zeile

    jan99 schrieb:

    Dim pref As Object = Application.Preferences
    dem Compiler sagst, dass pref ein Object ist und nicht das, was auch immer hinter Application.Preferences steht. Versuche einfach mal das As Object wegzulassen

    VaporiZed schrieb:

    Wie lautet denn die Fehlermeldung und von welchem Typ ist denn die Exception, die kommt?
    Auf diese Frage hast Du immer noch keine Antwort gegeben. Bitte hole dies nach, dann können wir dir evtl auch weiter helfen. Ich gehe mal davon aus, dass dir eine NullPointerException entgegen gebracht wird.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Kannst Du aus dem pref-Variablentypen was konkreteres als Object machen? Denn die Meldung besagt, dass das, was Du da anzusprechen versuchst, kein Bestandteil von Application.preferences ist. Von welchem Typ ist denn Application.preferences bzw. das eigentlich dahinter befindliche Objekt denn?
    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.

    jan99 schrieb:

    Das einzige was mich stutzig macht und ein Hinweis sein könnte ist die Tatsache, dass es in der anfangs genannten Funktion keine Autovervollständigung hinter "pref.Files." gibt!!!
    Naja - das kann ich dir erklären.
    Rate mal...
    Option Strict On!

    Bzw auch nicht, weil du bist ja vollkommen beratungsresistent.