| 

.NET C# Java Javascript Exception

1
Dann funktioniert doch ein einfaches
try
{
}
catch (Exception ex)
{
}

nicht.
News:
18.03.2011
Puster Hans 33 1 1 4
1
Bitte eine ausführlichere Beschreibung, so kann man nur raten was du meinst.
Hendrik Lösch 18.03.2011
Sorry, war wohl nicht ganz klar. Ein FileSystemWatcher überprüft im Hintergrund ein Verzeichnis. Angestoßen durch den FileSystemWatcher holt eine Methode Dateien aus dem Verzeichnis. Wenn dabei eine Exception passiert, will ich das natürlich an die Oberfläche melden. Das geht aber nicht, weil das ja in einem anderen Thread als dem Oberflächen Thread passiert. Wird es klarer?
Puster Hans 18.03.2011
Danke für die Ergänzung. Habe meine Antwort entsprechend erweitert.
Matthias Hlawatsch 18.03.2011
Beim FileSystemWatcher kann es oft mal zu Exceptions kommen da manche Events mehrfach gefeuert werden. Obacht auch bei Virenscanner.

Zitat MSDN:
Häufige Vorgänge in Dateisystemen können mehrere Ereignisse auslösen. Wenn eine Datei z. B. von einem Verzeichnis in ein anderes verschoben wird, werden möglicherweise mehrere OnChanged-Ereignisse und einige OnCreated-Ereignisse sowie OnDeleted-Ereignisse ausgelöst. Das Verschieben einer Datei ist ein komplexer Vorgang, der aus mehreren einfachen Vorgängen besteht und daher mehrere Ereignisse auslöst.
embee 18.03.2011
1 Antwort
2
Kommt drauf an, wie Du Deinen Thread startest. Wenn Du den BackgroundWorker benutzt, bekommst Du die Ex im RunWorkerCompleted-Event.

Wenn Du den Thread auf eine Weise gestartet hast, die diesen Komfort nicht bietet (z.B. über ThreadPool.QueueUserWorkItem), dann mußt Du die Ex im Thread selbst fangen und Dich selbst darum kümmern, dass der untergeordnete Thread dem übergeordneten die nötigen Informationen übermittelt. Bei QueueUserWorkItem kann man das z.B. über den state-Parameter abbilden.

Kommt natürlich auch darauf an, was Du dann mit der Ex machen willst, also ob es fachliche Fehler sind, die tatsächlich irgendwie im Kontext des übergeordneten Threads behandelt werden können, oder "unvorhergesehene Katastrophen", bei denen Du eh kaum eine andere Wahl hast, als sie zu protokollieren und dann an einem geeigneten Punkt neu aufzusetzen (default: Anwendung beenden). Für letzteres kannst Du Dich für das AppDomain.UnhandledException-Ereignis registrieren.

UPDATE, nach deinem Kommentar:
Sieht so aus, als käme der zweite Fall in Betracht. Dann könnte man das so lösen:
class MyFileWatcher
{
public EventHandler<EventArgs> ErrorOnReading;

public MyFileWatcher()
{
var fw = new FileSystemWatcher();
//configure...
fw.Changed += new FileSystemEventHandler(fw_Changed);
fw.EnableRaisingEvents = true;
}

void fw_Changed(object sender, FileSystemEventArgs e)
{
try
{
//dateien lesen
}
catch (IOException)
{
if (ErrorOnReading != null)
{
ErrorOnReading(this, EventArgs.Empty);
}
}
}
}

und in der Oberfläche (ich nehme hier mal Windows Forms) an:

var watcher = new MyFileWatcher();
watcher.ErrorOnReading += (s, e) => this.Invoke(new Action(() => errorLabel.Text = "Fehler beim Lesen der Dateien"; ));

Das nur als Skizze - Watcher und UI sollten besser entkoppelt werden, aber am Prinzip ändert sich dadurch nichts.
18.03.2011
Matthias Hlawatsch 13,2k 4 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH