2010-03-16 18 views
11

In C#, il codice di distribuzione genera e contenente le informazioni aggiuntive nello stack di chiamate?Lancio di eccezioni

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw; 
} 

risposta

12

Sì, lo sarà. Molti sviluppatori non si rendono conto che il codice seguente genererà una nuova eccezione da quel punto nello stack delle chiamate, non le chiamate effettuate in precedenza nello stack prima dello catch.

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw e; 
} 

Ho imparato questo nel modo più difficile!

+0

+1 per l'anti-esempio :) – Pharabus

+1

Ecco l'articolo di Eric Lippert: http://blogs.msdn.com/ericlippert/archive /2010/03/04/too-much-reuse.aspx "Il" lancio "non reimposta la traccia dello stack," lancia ex "" fa " – ram

1

Le eccezioni non sono immutabili e la possibilità di aggiungere informazioni a queste è una delle ragioni.

Quindi, sì, i dati verranno aggiunti alle informazioni sull'eccezione che si diffondono.

4
 var answer = "No"; 
     try 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      catch (Exception e) 
      { 
       e.Data.Add("mykey", "myvalue"); 
       throw; 
      } 
     } 
     catch (Exception e) 
     { 
      if((string)e.Data["mykey"] == "myvalue") 
       answer = "Yes"; 
     } 

     Console.WriteLine(answer); 
     Console.ReadLine();  

Quando si esegue il codice che troverete che la risposta è sì :-)

+1

... molto divertente;) – Ben

1

È possibile farlo, ma a causa di FxCop ho sempre creato eccezioni personalizzate quando mai mi passi ed eccezione. Questo dà al chiamante la capacità di catturare facilmente e comprendere diversi tipi di errori. Se è necessario includere un'eccezione successiva, è possibile utilizzare InnerException of Exception o semplicemente aggiungere una variabile membro per la nuova eccezione.

Questo ti dice come renderti il ​​tuo successo. http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

Questo è uno di quelli che programmano cose che la gente vuole saltare perché è semplicemente un lavoro extra per far funzionare un'applicazione.

Questa è una pagina dal mio personale Zen di programmazione:

Il vostro programma è la tua casa. Rendi il più bello possibile in modo che sia facile e divertente da vivere.

+0

+1 per il suggerimento di creare/catturare eccezioni personalizzate. Ovviamente dipende se hai il controllo sul codice che genera l'eccezione che stai intercettando, se si tratta di una libreria di terze parti sei un po 'bloccato con qualunque eccezione si tratti ;-) –

Problemi correlati