2009-06-12 8 views
9

Vamos Asume el bit folowing de código, que le permite llamar a una clase en un dominio de aplicación diferente y manejar casi cualquier excepción:Manejo de excepciones críticos en diferentes dominios de aplicación

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(); 
    } 

    } 
} 

Ahora el problema es, allmost cualquier Se puede manejar la excepción, no todas las excepciones. Una StackOverflowException, por ejemplo, aún bloqueará el proceso. ¿Hay alguna forma de detectar excepciones críticas en diferentes appdomains y manejarlas descargando el AppDomain, pero permitiendo que otros AppDomains continúen?

Respuesta

2

Lamentablemente, no se puede detectar una StackOverflowException.

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

... A partir de .NET Framework versión 2.0 , un objeto StackOverflowException no puede ser capturada por un try-catch bloque y el proceso correspondiente se terminado por defecto . ...

Actualización:

Después de investigaciones adicionales en mis viejos problemas que encontré este viejo hilo: http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=36073