AppDomain et Exception Handling

AppDomain et Exception Handling - C#/.NET managed - Programmation

Marsh Posté le 08-04-2007 à 13:54:55    

Bonjour,
 
Je cherche à créer des sous-domaines dans une application, afin de pouvoir exécuter du code dans un espace "confiné". Je voudrais donc qu'une exception levée (et pas interceptée) dans un sous-domaine ne fasse pas planter mon application.
Cependant j'ai quelques soucis pour ne faire "planter" que le sous-domaine.
 
La documentation de AppDomain.UnhandledException dit :  
 
"This event occurs only for the application domain that is created by the system when an application is started. If an application creates additional application domains, specifying a delegate for this event in those applications domains has no effect."
 
Visiblement, cet évenement est quand même déclenché dans un sous-domaine, par contre l'exception est propagée malgré l'interception de cet évenement, et ferme donc l'application entière.
 
Un exemple de code pour tester cela :
 

Code :
  1. using System;
  2. namespace TestAppDomain
  3. {
  4.     class Program
  5.     {
  6.         static AppDomain domain;
  7.         static void Main(string[] args)
  8.         {
  9.             domain = AppDomain.CreateDomain("child" );
  10.             domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
  11.             domain.DoCallBack(new CrossAppDomainDelegate(ChildDomainEntry));
  12.             Console.ReadLine();
  13.         }
  14.         static void ChildDomainEntry()
  15.         {
  16.             new System.Threading.Thread(new System.Threading.ThreadStart(Boom)).Start();
  17.         }
  18.         static void Boom()
  19.         {
  20.             throw new Exception();
  21.         }
  22.         static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  23.         {
  24.             Console.WriteLine("AppDomain = " + AppDomain.CurrentDomain.FriendlyName);
  25.             Console.WriteLine(e.ExceptionObject.ToString());
  26.             //AppDomain.Unload(domain);
  27.         }
  28.     }
  29. }


 
l'exception est bien écrite à la console, puis l'application est fermée.
 
Comment faire en sorte de ne faire fermer que le domaine fils, et pas l'application entière ?
 
Merci de vos réponses


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 08-04-2007 à 13:54:55   

Reply

Marsh Posté le 08-04-2007 à 17:52:43    

Ca me choque pas que ca plante.
T'as pas essayé de faire un try / catch autour de ton DoCallBack ?

Reply

Marsh Posté le 08-04-2007 à 18:17:22    

Je lance l'exception exprès dans un autre thread pour ne pas qu'elle remonte dans l'appelant, pour simuler un plantage dans le domaine fils indépendant de l'appel inter-domaine.
 
voila le nouveau code :
 

Code :
  1. using System;
  2. namespace TestAppDomain
  3. {
  4.     class Program
  5.     {
  6.         static AppDomain domain;
  7.         static void Main(string[] args)
  8.         {
  9.             domain = AppDomain.CreateDomain("child" );
  10.             domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
  11.             try
  12.             {
  13.                 domain.DoCallBack(new CrossAppDomainDelegate(ChildDomainEntry));
  14.             }
  15.             catch (Exception e)
  16.             {
  17.                 Console.WriteLine("Catch dans Main" );
  18.                 Console.WriteLine(e.Message);
  19.             }
  20.             Console.ReadLine();
  21.         }
  22.         static void ChildDomainEntry()
  23.         {
  24.             new System.Threading.Thread(new System.Threading.ThreadStart(Boom)).Start();
  25.         }
  26.         static void Boom()
  27.         {
  28.             throw new Exception();
  29.         }
  30.         static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  31.         {
  32.             Console.WriteLine("AppDomain = " + AppDomain.CurrentDomain.FriendlyName);
  33.             Console.WriteLine(e.ExceptionObject.ToString());
  34.            
  35.             //AppDomain.Unload(domain);
  36.         }
  37.     }
  38. }


 
L'exception n'est pas catché dans le block try/catch autour du DoCallBack

Reply

Marsh Posté le 09-04-2007 à 11:42:47    

tu n'as pas un élément dans ta variable e de type "UnhandledExceptionEventArgs" qui te permettrait de faire un cancel sur l'exception ou un truc dans ce genre la?

Reply

Marsh Posté le 09-04-2007 à 16:29:43    

Je ne vois pas non. Je peux me tromper merci de me le dire dans ce cas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed