2012-01-13 10 views
5

Ho un programma FileSystemWatch su cui sto lavorando e se si verifica un errore durante la copia di un file, desidero essere in grado di sapere su quale file è fallito. Allo stesso tempo, mi piacerebbe essere in grado di conservare la traccia dello stack, nonché le informazioni di eccezione interne.lanciare una nuova eccezione mantenendo traccia dello stack e informazioni sulle eccezioni interne

   if (!found) 
      { 
       try 
       { 
        File.Copy(file, Path.Combine(watchDirectory, filename)); 
       } 
       catch (Exception ex) 
       { 
        WriteToLog(new Exception(
         String.Format("An error occurred syncing the Vault location with the watch location. Error copying the file {0}. Error = {1}", file, ex.Message), ex.InnerException)); 
       } 
      } 

Così, l'eccezione che viene passato, ho ancora voglia di avere le informazioni StackTrace che, l'interno informazioni eccezione, ma voglio che il "messaggio" di essere il mio messaggio personalizzato che contiene quale file non è riuscito su, mentre mostra anche il messaggio "reale" che è stato lanciato dall'eccezione originale.

+1

http://stackoverflow.com/questions/57383/in-c-how-can-i-rethrow-innerexception-without-losing-stack-trace –

+1

Perché cosa stai creando una nuova eccezione? – Oded

+0

@Oded in modo da poter avere il file che ha avuto l'errore nel messaggio di eccezione effettivo – ganders

risposta

8

Ho modificato la nuova eccezione per accettare ex come eccezione interna anziché ex.InnerException. Se si chiama ToString() sulla nuova istanza di eccezione, includerà l'intera traccia dello stack e tutte le eccezioni interne.

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    string message = String.Format("An error occurred syncing the Vault location with the watch location. Error copying the file {0}.", file); 
    Exception myException = new Exception(message, ex); 
    string exceptionString = myException.ToString(); // full stack trace 
    //TODO: write exceptionString to log. 
    throw myException; 
} 
+0

Grazie @jrummell – ganders

Problemi correlati