Ich habe ein seltsames Problem: In einem komplexen Kamerasteuerprogramm, an dem ich arbeite, verwende ich ein SDK mit einem C# -Wrapper, der von jemand anderem programmiert wurde. Ich schließe den Wrapper als separates Projekt innerhalb derselben Lösung ein. Mein eigener Code ist ein WPF-Projekt, das zahlreiche Aufrufe in das SDK verwendet.C# Kann keine Ausnahmen von einem anderen Projekt in derselben Lösung abfangen
Alles synchron funktioniert gut. Abhängig von den Antworten der Kamera sendet das SDK jedoch gelegentlich asynchrone Antworten, normalerweise in Form einer benutzerdefinierten Ausnahme mit Informationen zu einem Fehler, den die Kamera meldet. Ich implementiert diese mit
try { ... } catch (ThisExceptionType) { ... }
jedoch wird keine Ausnahme jemals gefangen. Wenn eine Ausnahmesituation auftritt, bricht VisualStudio, zeigt mir den Code, wo das SDK es auslöst und meldet, dass "ThisExceptionType vom Benutzercode nicht behandelt wurde", wobei auch die Details der Ausnahmebedingung angezeigt werden (was bedeutet, dass sie offensichtlich ordnungsgemäß ausgelöst wurde). Ich habe überprüft, dass die Ausnahme der Fehlerbedingung entspricht, die ich erstellt habe. Ich bin mir sicher, dass ich nicht auf den falschen Teil meines Codes schaue.
Zu Testzwecken I ersetzt auch die Zeile in der SDK, wo es ThisExceptionType
mit einer Standard Ausnahme, wie throw new ArgumentException("Test");
gleiches Ergebnis führt: wenn meinen Fang catch (ArgumentException)
ändern, ich kann immer noch nicht den Zustand fangen und eine ähnliche unhandled- erhalten By-User-Code Fehler.
Hier ist, wie das SDK die Ausnahme auslöst:
void CallEntryPoint(...)
{
eNkMAIDResult result = _md3.EntryPoint(...);
switch (result)
{
// Note: Ignore these return values
case eNkMAIDResult.kNkMAIDResult_NoError:
case eNkMAIDResult.kNkMAIDResult_Pending:
break;
default:
throw new NikonException(...);
}
}
Was soll ich hier fehlt? Tut mir leid, wenn dies ein einfaches Problem ist - ich bin ziemlich erfahren in der allgemeinen Programmierung, habe aber nicht viel mit VisualStudio gearbeitet und auch nicht viel in C#.
UPDATE: Laut dem Autor Wrapper (dies ist eigentlich Thomas Dideriksen's Nikon SDK wrapper), „wenn Sie WPF oder WinForms-Anwendung schreiben, setzt der C# Wrapper auf der Warteschlange inhärenten Fenster Nachrichtenereignisse auf dem UI-Thread zu schießen.“
Er sagt auch, dass der Wrapper alle Kameraaufgaben der Reihe nach verarbeitet, also meine Aussage war falsch über den Wrapper asynchrone Ausnahmen werfen - alle Codebeispiele für den Wrapper verwenden die gleiche try { ... } catch (ThisExceptionType) { ... }
Ansatz. Zum Glück habe ich einige Ihrer Vorschläge ausprobiert, zum Beispiel indem Sie einen Handler an AppDomain.CurrentDomain.UnhandledException
angehängt haben, aber dieser Ansatz konnte die Ausnahme auch nicht abfangen.
Irgendwelche anderen Ideen, warum dies geschehen kann?
das Problem ist die asynchrone Verarbeitung. Ausnahmen von anderen Threads werden nicht im Hauptthread abgefangen. Es gibt eine Menge Beiträge zu diesem Thema wie [this] (http://stackoverflow.com/questions/5983779/catch-exception-that-is-thrown-in-different-thread) –
Ich denke, Sie behandeln die asynchrone Nachrichtenübermittlung über Ereignisse; Könntest du den Code posten? –
"Das SDK sendet gelegentlich * asynchrone * Antworten": Klingt so, als würde die Ausnahme nicht zwischen Versuch und Fang geworfen. Können Sie Ihren Code einfügen, der mit dem SDK interagiert? Ich nehme an, dass Ihr Code etwas tun muss, das bewirkt, dass das SDK abgeht und seine Sache macht und dann schließlich die Ausnahme auslöst. Wenn der moderne SDK-Code 'Task' /' async' verwendet, [sollte es möglich sein, einen Versuch/Fang um ein 'warten' zu werfen] (http://stackoverflow.com/a/19865613/424129). –