2009-06-12 17 views
9

Lassen Sie uns das Folowing Stück Code asume, mit dem Sie eine Klasse in einer anderen AppDomain und Griff fast jede Ausnahme aufrufen können:Umgang mit kritischen Ausnahmen in verschiedenen AppDomains

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace MyAppDomain 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain myDomain = null; 
     try 
     { 
     myDomain = AppDomain.CreateDomain("Remote Domain"); 
     myDomain.UnhandledException += new UnhandledExceptionEventHandler(myDomain_UnhandledException); 
     Worker remoteWorker = (Worker)myDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Worker).FullName); 
     remoteWorker.VeryBadMethod(); 
     } 
     catch(Exception ex) 
     { 
     myDomain_UnhandledException(myDomain, new UnhandledExceptionEventArgs(ex, false)); 
     } 
     finally 
     { 
     if (myDomain != null) 
      AppDomain.Unload(myDomain); 
     } 

     Console.ReadLine(); 
    } 

    static void myDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Exception ex = e.ExceptionObject as Exception; 
     if (ex != null) 
     Console.WriteLine(ex.Message); 
     else 
     Console.WriteLine("A unknown exception was thrown"); 
    } 
    } 

    public class Worker : MarshalByRefObject 
    { 
    public Worker() 
    { 

    } 

    public string DomainName 
    { 
     get 
     { 
     return AppDomain.CurrentDomain.FriendlyName; 
     } 
    } 

    public void VeryBadMethod() 
    { 
     // Autch! 
     throw new InvalidOperationException(); 
    } 

    } 
} 

Das Problem ist jetzt, allmostjede Ausnahme kann behandelt werden, nicht jede Ausnahme. Eine StackOverflowException zum Beispiel stürzt den Prozess immer noch ab. Gibt es eine Möglichkeit, kritische Ausnahmen in verschiedenen Anwendungsdomänen zu erkennen und diese zu behandeln, indem Sie die Anwendungsdomäne entladen, aber weiterhin andere Anwendungsdomänen zulassen?

Antwort

2

Leider kann eine StackOverflowException nicht abgefangen werden.

See: http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

... Beginnend mit dem .NET Framework Version 2.0, ein Stackoverflow Objekt kann nicht durch einen Try-Catch Block und den entsprechenden Prozess wird standardmäßig beendet gefangen werden . ...

Update:

Nach einer weiteren Untersuchung in meiner alten Ausgaben ich diesen alten Thread gefunden: http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=36073

Verwandte Themen