Warum würde das alles fangen und nicht alle fangen?

7

Der Code ist ziemlich einfach --- das Problem ist, dass ein ungültiges Zeichen in der groupPath-Zeichenfolge (ein '/' um genau zu sein).

Was ich versuche zu tun (zumindest als Stop-Lücke) ist das Überspringen von DirectoryEntries, für die ich die cn nicht bekommen kann --- egal warum.

Aber wenn ich diesen Code ausführe, läuft der catch-Block nicht und ich bekomme stattdessen: Der Server ist nicht betriebsbereit. und eine unbehandelte System.Runtime.InteropServices.COMException.

Warum würde der catch-Block diese Ausnahme nicht abfangen?

%Vor%

Zusätzliche Beobachtungen: Der Code befindet sich tatsächlich in einem benutzerdefinierten RoleProvider, und das Interessante daran ist, dass, wenn ich diesen Provider in einer einfachen Winforms-App referenziere und dieselbe Methode mit den gleichen Eingaben aufruft, der catch-Block genau das tut, was er tun soll. Ich denke, dies deutet darauf hin, dass die vorgeschlagene Antwort zu .NET-Ausnahmen und COM-Ausnahmen nicht korrekt ist. Obwohl ich nicht verstehen kann, warum dieser Code beim Ausführen vom WebDev-Server nicht abfangen würde

    
Ralph Shillington 22.05.2009, 16:22
quelle

5 Antworten

13

Wenn Sie nicht festlegen, was abgefangen werden soll, werden standardmäßig .NET-Ausnahmen verwendet. Ihre Ausnahme ist in COM, wo .NET nicht festgelegt ist, um die Ausnahme abzufangen. Der beste Weg, damit umzugehen, ist, die COM-Ausnahme zu fangen, die ungefähr so ​​aussehen sollte:

%Vor%     
Noah 22.05.2009, 16:53
quelle
3

Es gibt drei Gründe:

  1. Es gibt einen Fehler in der Laufzeitumgebung
  2. Die Anwendung und / oder der Thread endet als Teil eines Teils des Codes, der ausgeführt wird
  3. Sie sehen nicht das ganze Bild

Persönlich stimme ich für 3, und ich hatte unzählige Debugging-Sitzungen, wo ich mich frage, warum ein Teil des Codes meine Ausnahmen nicht behandelt, während Visual Studio tatsächlich so konfiguriert war, dass er bei allen geworfenen Ausnahmen stoppt ob sie gefangen wurden oder nicht.

Haben Sie versucht, das Programm einfach zu fragen, ob es im Debugger weiterläuft und ob es dann im Catch-Block landet?

Überprüfen Sie auch die Einstellung in Visual Studio, gehen Sie zum Dialogfeld Debug & Ausnahmen; prüfen Sie, ob eines der Kontrollkästchen ausgelöst aktiviert ist. Wenn Sie haben, könnte das Ihr Problem sein.

Natürlich, wenn Sie dieses Problem zur Laufzeit sehen, kein Debugger angefügt, dann habe ich keine Ahnung, außer für Punkt 1 und 2 oben.

Und natürlich gibt es immer Punkt 4: Das Unbekannte.

    
quelle
2

Eine COMException, die in diesem try-Block ausgelöst wird, wird vom catch-Block abgefangen und verschluckt.

Machen Sie eine Pause, holen Sie sich einen Kaffee, setzen Sie einen Haltepunkt auf die Zeile "Logger.Error ..." und versuchen Sie es erneut.

    
Joe 22.05.2009 19:48
quelle
2

Entlang der COMException gibt es auch asynchrone Ausnahmen, die NICHT gefangen werden, wie zB:

  • OutOfMemoryException
  • StackoverflowException (Nein, es ist kein Witz in Bezug auf diese Website :))
  • ThreadAbortException

Sind Sie sicher, dass das nicht der Fall ist?

    
Andrei Rînea 22.05.2009 20:14
quelle
1

Ich hatte ein ähnliches Problem. Ich habe ein VB6-COM-Objekt aufgerufen, das einen Fehler ausgelöst hat. Der tatsächliche Ausnahmetyp stellte sich als System.Reflection.TargetInvocationException heraus. Die innere Ausnahme wurde auf die COMException festgelegt. Am Ende habe ich die System.Reflection.TargetInvocationException abgefangen und die innere Ausnahmebedingung

überprüft     
chris 27.07.2009 21:36
quelle