Frage

Ich bin eine .NET-Wrapper-Klasse für eine vorhandene nativen Klasse zu schreiben, die Ausnahmen auslöst. Was sind die besten Praktiken für ++ Ausnahmen und Managed Ausnahmen zwischen nativen C übersetzen? Fang und Wiederwurf auf einer Eins-zu-eins-Basis (zum Beispiel std :: invalid_argument -> System.System.ArgumentException)? Gibt es eine Zuordnung bereits irgendwo erstellt?

War es hilfreich?

Lösung

Es gibt kein Standard-Mapping, die ich kenne. Was ich in der Vergangenheit getan ist die, die übersetzt ich kenne, und einen catch-Block für System.Runtime.InteropServices.SEHException. Alle nicht übersetzt Ausnahmen werden in dieser Ausnahme gedreht werden. Solange Sie ein Debug-Build des Codes, den die Ausnahme wirft, sollten Sie eine schöne Stack-Trace erhalten. Dann können Sie auf Ausnahme gehen und schauen und die Verpackung schreiben.

Aber am letzten Projekt, das ich dies auf zu tun hatte, ging ich mit etwas viel einfacher, landete ich für logic_error und runtime_error ein paar System.Exception Derivate Schreiben auf. Dann würde ich diese zwei Basisklassen fangen und verwenden typeid (err), um die .NET-Nachricht zu schreiben, die ausgelöst wurde. Auf diese Weise habe ich nicht „verlieren“, was aus dem C geworfen wurde ++ aber musste nicht alles außer den wichtigsten kartieren.

Andere Tipps

Eins-zu-Eins-Abbildung scheint die vernünftigste Ansatz zu mir. „Universal“ Mapping ist kaum möglich, da von anwendungsspezifischen Ausnahmen, obwohl es einige offensichtliche Mapping für STL Ausnahmeklassen ist.

Auch gibt es ein Problem von SEH Ausnahmen von nicht verwalteten Code. Je nach Situation kann es notwendig sein, um sie zu fangen und zu wickeln auch.

Ich denke, es auf die Gestaltung der Hülle abhängt. Wenn die Schnittstelle des Manager-Wrapper auf die nicht verwaltete Bibliothek Schnittstelle fast identisch sein wird, rethrow dann die Ausnahmen 1: 1. Wenn Sie die Schnittstelle wesentlich sind zu ändern, dann werfen Ausnahmen am besten geeignet für die neue Schnittstelle. So oder so, stellen Sie sicher, dass der Wrapper wirft Ausnahmen jederzeit eine Operation kann nicht mit .NET-Design-Richtlinien konsistent sein abgeschlossen werden.

Was sind Sie wirklich versuchen zu tun?

Interop übersetzt bereits nativen Ausnahmen verwaltet, einschließlich SEH Ausnahmen. Aber gutes Design diktiert, dass ALL Ausnahmen sollten in der nativen API-Ebene abgefangen werden. Sie sollten nicht davon abweichen, es sei denn es einen guten Grund. Wir wissen nicht genug über Ihr Design.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top