| 

.NET C# Java Javascript Exception

1
Hallo zusammen,

ich nutze eine API eines Herstellers zur Ansteuerung eines Gerätes. Diese wird per using eingebunden. Wenn auf dem Geräterechner ein zusätzlicher Treiber nicht installiert worden ist, wirft diese API beim Aufruf der Initialisierung eine System.DllNotFoundException. Die kann ich fangen. Soweit ist alles in Ordnung. Beende ich aber nun meine Anwendung, wirft diese API im "Base.Finalize()" nochmals diese Exception ... :(

Ich versuche gerade erfolglos die Stelle zu finden, an der ich in meiner Anwendung (WPF, .NET4) diese Exception fangen kann. Wo könnte ich ansetzen um diese Exception zu fangen?

Danke,
Mike

Nachtrag zur Idee von Matthias:
m_Service = new Service("service");
m_Service.Connected += new PviEventHandler(m_Service_Connected);
try
{
m_Service.Connect();
}
catch (System.Exception)
{
try
{
m_Service.Dispose();
}
catch (System.Exception ex)
{
MessageBox.Show("Noch eine Exception beim Dispose: " + ex.Message);
}
}

So bekomme ich beim Dispose zwar noch mal die Exception, aber beim Schliessen des Programms kommt dann nochmal eine.
24.08.2011
Xantiva 2,3k 2 9
Xantiva 2,3k 2 9
1 Antwort
1
Wenn die API IDisposable korrekt implementiert (was sie tun sollte, da sie ja anscheinend unmanaged Ressourcen belegt), dann könntest Du versuchen, vor dem Beenden Dispose() aufzurufen. Die Ex sollte dann schon da fliegen (wie gesagt: wenn der Hersteller Dispose und Finalizer korrekt gebaut hat), und Du kannst sie fangen.

Update:
Wenn der Code trotz manuellem Dispose beim Beenden nochmal in den Finalizer läuft, dann stehen Deine Chancen ziemlich schlecht. Denn eigentlich sollen Finalizer keine Exceptions werfen. Wenn sie es doch tun, dann behandelt die CLR das als absolut fatale Situation und beendet die App ziemlich rasch:
If Finalize or an override of Finalize throws an exception, and the runtime is not hosted by an application that overrides the default policy, the runtime terminates the process and no active try-finally blocks or finalizers are executed. This behavior ensures process integrity if the finalizer cannot free or destroy resources.
Quelle: MSDN
Du könntest probieren, ob Dir AppDomain.UnhandledException hilft, das Verhalten des Programms zumindest etwas "netter" zu gestalten. Ansonsten sehe ich aber nur die Möglichkeit, den Hersteller um einen Fix zu bitten oder zu versuchen, das Problem aktiv zu vermeiden, in dem Du vor der Initialisierung selbst prüfst, ob der Gerätetreiber installiert ist.
24.08.2011
Matthias Hlawatsch 13,2k 4 9
Danke für den Tipp, ich habe es ausprobiert (siehe Nachtrag in der Frage). Leider wird dann immer noch die Exception am Ende geworfen ...
Xantiva 24.08.2011
:-( Siehe mein Update.
Matthias Hlawatsch 24.08.2011
Hehe, gerade eine neue "beta" Version der API bekommen. Da taucht der die Exception im Finalizer nicht mehr auf. Nur noch die im Dispose. Da weiss ich jetzt ja, wie ich die gefangen bekomme! :D
Xantiva 24.08.2011

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