2011-01-06 15 views
2

Ich habe Probleme mit einer Anwendung, die ich geschrieben habe. Sie erstellt im Grunde dynamisch generierte Assemblys basierend auf Codeeingabe durch den Benutzer.
Es kompiliert und läuft gut, aber aus irgendeinem Grund, manchmal, wenn eine Ausnahme in dieser kompilierten Assembly auftritt, stürzt es das Hauptprogramm ab, obwohl alles in Try/Catch-Blöcke vollständig beschichtet ist.Fehler beim Erfassen der dynamisch generierten Assembly

ich hinzufügen try/catch-Blöcke des Benutzers Code in der generierten Assembly zu umgeben, und auch try/catch um die Invocation der Versammlung in meiner App:

StringBuilder verificationErrors = new StringBuilder(); 
argz[0] = "hello!"; 
argz[1] = verificationErrors; 
object loResult = null; 
try 
{ 
    loResult = loObject.GetType().InvokeMember("doThis", BindingFlags.InvokeMethod, null, loObject, argz); 
} 
catch (Exception p) 
{ 
    MessageBox.Show(p.Message); 
} 

Es ist wie der Fehler sieht geworfen wird außerhalb der Reichweite meiner App, so dass es nicht weiß, wie man es fängt oder etwas in dieser Richtung ... irgendwelche Ideen?

+4

Was ist der Fehler? –

+4

... und wie generieren Sie die Baugruppe? CodeDom? Reflection.Emit? Etwas anderes? –

+0

Haben Sie versucht, es zu debuggen, indem Sie einen Haltepunkt bei 'loResult = .....' setzen, um zu überprüfen, ob das Steuerelement diese Zeile erreicht oder nicht? –

Antwort

0

Es ist möglich, dass der Aufruf von p.Message eine Ausnahme auslöst. Man würde annehmen, dass wir die Standard-Message-Eigenschaft verwenden, aber es könnte eine benutzerdefinierte Ausnahme sein, die die Message-Eigenschaft außer Kraft setzt.

Ich würde den Code in den catch-Block mit einem weiteren try ... catch, und wenn es einen Fehler wirft, einfach sagen "Ein unerwarteter Fehler ist aufgetreten", und protokollieren, was Sie können darüber.

+0

Es ist nicht die p.Message, ich habe versucht, nur einen leeren Haken setzen und es ist immer noch nicht den Fehler abfangen, es Fehler in der Zeile, wo ich die Funktion in der generierten Assembly aufrufen. Ich weiß genau, warum es fehlerhaft ist, es ist einfach nicht vermeidbar, weil die Benutzer ihren eigenen Code eingeben dürfen - also muss ich es abfangen können. Es gibt try/catch-Blöcke um den Code des Benutzers herum und den Aufruf der generierten Assembly-Funktion, aber die App stürzt immer noch ab und sagt unbehandelte Ausnahme. – Brian

+0

Sie könnten versuchen, einen spezifischen catch-Block für SeleniumExceptions einzufügen. Ohne die Besonderheiten der Interna des SeleniumException-Objekts zu kennen, können Sie nicht sicher sein, wie es sich verhalten wird. Ich meine, als .net-Programmierer sind wir darauf trainiert, dass "catch (Exception e)" alles fangen soll, aber die Realität ist, dass diese Ausnahme und der damit verbundene Code enthält, dass CLR sie bearbeiten soll.Stellen Sie außerdem sicher, dass der Aufruf-Stack angezeigt wird, wenn Sie die Ausnahme debuggen (Debug ... Windows ... Call Stack). Das gibt dir vielleicht einen Hinweis darauf, was vor sich geht. –

+0

Letzter Ratschlag, wenn Sie nicht debuggen können, Instrument. Setzen Sie Protokolleinträge vor und geben Sie den kompilierten Benutzercode ein und sehen Sie, was Ihnen das sagt. –

0

Wenn Sie das Programm im Debug ausführen und Visual Studio anweisen, beim Auslösen einer Ausnahme zu brechen, sollten Sie in der Lage sein, die Stack-Ablaufverfolgung zu überprüfen und festzustellen, welche Methode die Ausnahme auslöst.

  1. Zum Debug/Ausnahmen ...
  2. Markieren Sie das Kästchen vor "Common Language Runtime Ausnahmen", in der Spalte "Geworfene"
  3. Klicken Sie auf "OK"
  4. Führen Sie das Programm im Debug Modus
+0

Dies bietet keine große Hilfe, da die dynamisch generierte Assembly nicht debuggt werden kann, sondern nur die App, die die Assembly steuert. – Brian

+0

Und ich weiß genau, wo der Fehler auftritt, es gibt einfach nichts, was ich tun kann, um es zu verhindern, da der Benutzer derjenige ist, der den C# -Code in die dynamisch erzeugte Assembly eingibt. Es ist kein Kompilierungsfehler, es ist ein Laufzeitfehler, der nur manchmal auftritt, aber er wird nicht abgefangen, obwohl er direkt in einem try/catch liegt. – Brian

+0

In welcher der von Ihnen geposteten Zeilen wird der Fehler ausgelöst? –

Verwandte Themen