Ich habe eine kleine WinForms-App, die ein BackgroundWorker-Objekt verwendet, um einen lang laufenden Vorgang auszuführen.
Die Hintergrundoperation löst gelegentlich Ausnahmen aus, normalerweise wenn jemand eine Datei geöffnet hat, die neu erstellt wird.
Unabhängig davon, ob der Code von der IDE ausgeführt wird oder nicht. .NET öffnet ein Fehlerdialogfeld, in dem der Benutzer darüber informiert wird, dass eine nicht behandelte Ausnahme aufgetreten ist. Das Kompilieren des Codes mithilfe der Release-Konfiguration ändert dies ebenfalls nicht.
Laut MSDN :
Wenn die Operation eine Ausnahme auslöst, die Ihr Code nicht behandelt, fängt der BackgroundWorker die Ausnahme ab und übergibt sie an den RunWorkerCompleted-Ereignishandler, wo sie als Error-Eigenschaft von System.ComponentModel .. ::. RunWorkerCompletedEventArgs verfügbar gemacht wird. Wenn Sie unter dem Visual Studio-Debugger ausgeführt werden, wird der Debugger an der Stelle im DoWork-Ereignishandler unterbrochen, an der die nicht behandelte Ausnahme ausgelöst wurde.
Ich erwarte, dass diese Ausnahmen gelegentlich ausgelöst werden, und möchte sie eher im RunWorkerCompleted-Ereignis als in DoWork behandeln. Mein Code funktioniert ordnungsgemäß und der Fehler wird im RunWorkerCompleted-Ereignis korrekt behandelt, aber ich kann für mein ganzes Leben nicht herausfinden, wie ich das Auftreten des .NET-Fehlerdialogs verhindern kann, in dem über die "Nicht behandelte Ausnahme" geklagt wird.
Soll der BackgroundWorker diesen Fehler nicht automatisch abfangen? Ist das nicht das, was in der MSDN-Dokumentation steht? Was muss ich tun, um .NET darüber zu informieren, dass dieser Fehler behandelt wird , während die Ausnahme weiterhin in die Error-Eigenschaft von RunWorkerCompletedEventArgs übertragen werden kann?
BackgroundWorker DoWork
"), anstatt zu versuchen, das Richtige zu tun und nur die Dinge zu verwirren .Ich würde dem MSDN-Text hinzufügen :
... UND der Debugger meldet die Ausnahme als "~ Ausnahme wurde vom Benutzercode nicht behandelt"
Lösung: Führen Sie das Programm nicht unter dem Debugger aus und es funktioniert wie erwartet: Ausnahme in e.Error abgefangen.
quelle
RunWorkerCompleted
Ausnahmebehandlung des Ereignisses zu debuggen .RunWorkerCompleted
.Dies ist eine alte Frage, aber ich habe sie gefunden, als ich die gleichen Symptome gegoogelt habe. Veröffentlichen Sie dies, falls jemand anderes es aus demselben Grund findet.
Judahs Antwort ist richtig, aber es ist nicht der einzige Grund, warum das Dialogfeld "Nicht behandelte Ausnahme im Benutzercode" angezeigt werden kann. Wenn eine Ausnahme aus einem Konstruktor im Hintergrundthread ausgelöst wird , führt diese Ausnahme sofort zum Dialogfeld und wird nicht an das Ereignis RunWorkerCompleted übergeben. Wenn Sie den fehlerhaften Code außerhalb eines Konstruktors (auf eine andere Methode) verschieben, funktioniert er wie erwartet.
quelle
RunWorkerCompleted
hat sie abgefangen. Vielleicht haben Sie es mit einer Konsolenanwendung versucht? Nach dieser Antwort verhalten sich Konsolen-Apps anders.[Bearbeiten]
Juda hat einen großen Punkt. In meinem Beispiel wurde auf die Besonderheiten der Fehlerbehandlung hingewiesen, aber mein Code würde tatsächlich eine weitere Ausnahme verursachen, wenn in der DoWork-Methode niemals eine Ausnahme getroffen würde. Dieses Beispiel ist in Ordnung, da wir speziell die Fehlerbehandlungsfunktionen des BackgroundWorker zeigen. Wenn Sie den Fehlerparameter jedoch nicht gegen null prüfen, kann dies Ihr Problem sein.
[/Bearbeiten]
Ich sehe nicht die gleichen Ergebnisse. Kannst du einen kleinen Code posten? Hier ist mein Code.
private void Form1_Load(object sender, EventArgs e) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.RunWorkerAsync(); } void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // Will cause another exception if an exception didn't occur. // We should be checking to see if e.Error is not "null". textBox1.Text = "Error? " + e.Error; } void worker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 10; i++) { if (i < 5) { Thread.Sleep(100); } else { throw new Exception("BOOM"); } } }
Programmausgabe:
Ein interessanter Artikel, der Ihrer Frage ähnelt. Es enthält einen Abschnitt zum Umgang mit Ausnahmen.
http://www.developerdotstar.com/community/node/671
quelle
Ich hatte das gleiche Problem und habe bereits die Antwort von Juda angewendet, bevor ich dieses Thema nach einigem googeln gefunden habe.
Nun, imo ist die Antwort von Juda teilweise richtig. Ich habe hier eine bessere Antwort gefunden
Der Debugger macht die Arbeit gut. Wenn Sie die Anwendung unter "realen Bedingungen" ausführen, behandelt RunWorkerCompleted die Ausnahme wie erwartet und das Anwendungsverhalten ist ebenfalls das erwartete.
Ich hoffe diese Antwort hilft.
quelle