Laden...

Exceptions in C++/CLI Code abfangen bzw. deren Auswirkungen verhindern

Erstellt von AlexDozer vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.259 Views
A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren
Exceptions in C++/CLI Code abfangen bzw. deren Auswirkungen verhindern

Hi,

ich habe folgendes Problem. Ich habe eine Applikation geschrieben zu Testzwecken.
Das heißt ich rufe nacheinander Funktionen auf die irgendetwas testen. Dabei wird auch
C++/CLI Code getestet.

Nun hatte ich gerade den Fall das einer der getesteten DLLs eine SystemAccessViolationException geworfen
hat welche mein try/catch-Block nicht abgefangen hat und somit meine Applikation abgeschmiert ist.

Das kann ich natürlich überhaupt nicht gebrauchen da alle Tests die danach dran gewesen währen nicht mehr ausgeführt wurden.

Meine Frage: Wie kann ich in diesem Fall verhindern das die ganze Applikation abschmiert wenn in einer benutzen DLLs so ein Fehler auftritt?

Gruß Alex

G
538 Beiträge seit 2008
vor 12 Jahren

Wie sieht denn dein TryCatch-Block aus?

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

5.658 Beiträge seit 2006
vor 12 Jahren

Hi AlexDozer,

interessant wäre noch zu wissen, ob der Try-Catch-Block bzw. die Exception-Quelle im managed oder im unmanaged Teil zu finden sind.

Christian

Weeks of programming can save you hours of planning

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren
 try
{
    var activator = new KeywordActivator();
    var activatedKeyword = activator.ActivateKeyword(keyword);
    activatedKeyword.Do(_reportManager);
}
catch (Exception e)
{
    _reportManager.WriteError(e.Message);
    _reportManager.WriteError(e.StackTrace);
    return TestResult.Error;
}

Die Do() Methode beinhaltet immer den Test-Code. Hier wird die Exception geworfen.
Der Code der die Exception wirft ist C++ Code, also unmanaged.

Gruß Alex

5.658 Beiträge seit 2006
vor 12 Jahren

Hi AlexDozer,

mein erster Gedanke ist, daß die SystemAccessViolationException in die gleiche Kategorie fällt wie eine SystemOutOfMemoryException, die man einfach nicht abfangen kann. Du könntest ja mal spaßenshalber probieren, im unmanaged Teil eine InvalidOperationException (o.ä.) zu werfen, und schauen, ob du sie im managed Teil abfangen kannst.

Christian

Weeks of programming can save you hours of planning

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren

Wenn man solche Exceptions nicht abfangen kann, kann man dann wenigstens verhindern das mir meine Applikation abschmiert? Primär gehts mir ja darum das meine Applikation am Leben bleibt. Das Tests fehlschlagen ist bei der Testerei ganz normal 😃

Was währe wenn ich das ganze in einem Thread laufen lassen würde, würde dann nur der Thread wegschmiern oder auch die Applikation?

Gruß Alex

5.658 Beiträge seit 2006
vor 12 Jahren

Hi AlexDozer,

bei einer SystemOutOfMemoryException kannst du das auch nicht verhindern.
Ich glaube übrigens, dein unmanaged Code müßte in einem anderen **Prozess **laufen, damit nicht die ganze Anwendung abschmiert.

Andererseits solltest du evtl. mal der SystemAccessViolationException nachgehen. Das bedeutet nämlich auf jeden Fall, daß dort in den protected Memory geschrieben wird, bzw. in einen nicht reservierten Speicherbereich.

Christian

Weeks of programming can save you hours of planning

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren

Angenommen ich würde das ganze in einem eigenen Prozess laufen lassen würden, könnte ich dann am Return-Code erkennen das die Applikation unerwartet beendet wurde? Wenn ja währe das eine Möglichkeit.

Ach ja, die Entwickler sehen sich die Exception schon an. Meine Aufgabe ist es nur Fehler zu finden 😃

Ich probier das morgen einfach mal aus und gebe dann Feedback!

Gruß Alex

5.742 Beiträge seit 2007
vor 12 Jahren

Zur Not kannst du auch einen managed C++ Wrapper schreiben, der die C++ Exceptions abfängt und durch CLR-Exceptions "ersetzt".

A
AlexDozer Themenstarter:in
54 Beiträge seit 2010
vor 12 Jahren

Ich hab es jetzt mit dem Process gelöst. Funktioniert einwandfrei. Werde mir allerdings auch mal den C++ Wrapper ansehen, momentan hab ich dazu aber keine Zeit.

Gruß Alex