WebClient.UploadFileCompleted-Event auf Fehlermeldung prüfen durch If e.error.message = Nothing

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von 200-ghz.

    WebClient.UploadFileCompleted-Event auf Fehlermeldung prüfen durch If e.error.message = Nothing

    Hallo,
    ich möchte prüfen, ob beim (asynchronen) Upload mit einem WebClient ein Fehler aufgetreten ist.

    Da, wenn keine Fehler vorliegen, für e.error.message eine NullReferenceException auftritt möchte ich die Fälle so unterscheiden:

    VB.NET-Quellcode

    1. '
    2. Sub WebClientUpload_Completed(ByVal sender As Object, ByVal e As System.Net.UploadFileCompletedEventArgs) Handles WebClientUpload.UploadFileCompleted
    3. If e.Error.Message = Nothing Then ' habe es hier auch mit If IsNothing(e.error.message) probiert
    4. ' in diesem Fall tritt eine NullReferenceException auf
    5. Else
    6. ' in diesem Fall tritt kein Fehler auf
    7. MsgBox(e.error.message)
    8. End if
    9. End Sub


    Warum tritt für den 1. Fall (If-Abfrage trifft zu) eine NullReferenceExcpeiton auf, wenn ich prüfe, ob e.Error.Message = Nothing? Wie soll man das sonst prüfen?
    Weiß nicht genau, was du meinst, denn ich will ja prüfen, ob die Fehlermeldung existiert oder nicht.

    e.Error.Message gibt tatsächlich eine Fehlermeldung an (bzw. ist die Fehlermeldung) wenn ein Fehler aufgetreten ist, nur ist sie eben Nothing, wenn kein Fehler aufgetreten ist.
    Da ich aber im UploadFileCompleted Event erst an den Fehler komme (bzw. prüfen kann, ob ein Fehler vorliegt), muss ich die Fallunterscheidung mit If machen.
    Wenn jetzt e.Error.Message nicht Nothing ist, weil ein Fehler aufgetreten ist, dann läuft die If-Abfrage auch problemlos durch.
    Egal, ob ich den "True-Part" der If-Abfrage auf e.Error.Message = Nothing oder e.Error.Message <> Nothing setze, der True-Part wirft immer die Fehlermeldung aus.
    Öhm, geraten: Du fängst Die Meldung ja nicht ab, (Try/Catch), sodass sie einfach als Ausnahme geworfen wird.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    e.Error ist ein Objekt und laut MSDN nothing, wenn kein Fehler vorliegt. Entsprechend kannst du nicht auf e.Error.Message zugreifen, weil halt e.Error schon nicht gesetzt ist.

    Also sollte deine Abfrage eher If e.Error = Nothing Then sein. Message wird wohl immer gesetzt sein (sofern halt die Exception gesetzt ist).
    Das wollte ich eigentlich machen, aber If e.Error = Nothing lässt er nicht zu ("Fehler 1 Der =-Operator ist für die Typen "System.Exception" und "System.Exception" nicht definiert.")

    EDIT: Mit IsNothing(e.error) = true funktioniert die Abfrage offenbar, seltsamerweise wirft er keine Fehlermeldung aus, wenn ich erst mit dem richtigen Passwort hochlade und es direkt danach nochmal mit einem falschen probiere. Versuche ich es nur mit falschen Passwörtern, ohne vorher einmal das richtige eingegeben zu haben, dann wirft er die Fehlermeldung aus. Liegt das am WebClient?


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „200-ghz“ ()

    200-ghz schrieb:

    dann müsste ich aber im Catch von Try den Upload erfolgreich part reinpacken.

    Wieso?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Wenn ich die herausfilter, würde er ja bei der If-Abfrage, wenn der Fehler (e.Error = Nothing) auftritt, den restlichen Code nicht mehr ausführen. Da aber noch etwas passieren soll, wenn kein Fehler vorliegt (e.Error = Nothing), muss ich den Code ja dann zu Catch packen... Aber das Problem hat sich jetzt gelöst mit IsNothing(e.Error).

    Nur: Seltsamerweise wirft er keine Fehlermeldung aus, wenn ich erst mit dem richtigen Passwort hochlade und es direkt danach nochmal mit einem falschen probiere (vor jedem Upload werden die Credentials neu gesetzt, mit dem eingegebenem PW). Versuche ich es nur mit falschen Passwörtern, ohne vorher einmal das richtige eingegeben zu haben, dann wirft er die Fehlermeldung aus. Liegt das am WebClient?
    Also, das klingt mir zu kompliziert, komplizierter als es ist :D
    Try -> Klappt, aber sobald ein Fehler kommt springt er ins Catch, sodass da keine Abfrage mehr nötig ist.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Doch, denn beim asynchronen Upload kann ich nicht den Try-Block um WebCLient.UploadFileAsync( [...] ) setzen, denn da wird der Fehler nicht erkannt.
    Und im UploadCompleted-Event tritt ja kein Fehler auf, wenn ich nicht aktiv versuche auf e.Error zuzugreifen, d.h.:

    VB.NET-Quellcode

    1. ' Das alles im UploadCompleted-Event, angenommen es liegt kein Fehler vor
    2. ' Ohne weitere Abfrage realisiert würde es ja nur so gehen:
    3. Try
    4. MsgBox(e.Error.Message) ' <- ich möchte ja eben den Fall finden, indem eine Fehlernachricht angezeigt werden muss
    5. ' weiterer Code, der hier steht wird nur ausgeführt, wenn ein Fehler vorliegt, da man hier sonst schon im Catch wäre
    6. Catch ex as exception
    7. ' dieser Code läuft ab, wenn e.Error.Message eine NullReferenceException auswirft, also kommt hier der "Upload-Erfolgreich-Code" hin
    8. End Try
    Achso, Du machst das asynchron. Na ja, dann geht es wohl nicht anders.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: