2012-01-13 18 views
5

Tengo un programa FileSystemWatch en el que estoy trabajando y si hay un error al copiar un archivo, quiero saber en qué archivo falló. Al mismo tiempo, me gustaría poder conservar el seguimiento de la pila, así como la información de excepción interna.throw new Excepción mientras se guarda el rastreo de pila y la información de excepción interna

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

Por lo tanto, la excepción que se pasa, todavía quiere tener la información StackTrace que, la información de excepción interna, pero quiero que el "mensaje" para que sea mi mensaje personalizado que contiene qué archivo se falló en, a la vez que muestra el mensaje "real" arrojado por la excepción original.

+1

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

+1

¿Por qué estás creando una nueva excepción? – Oded

+0

@Oded así que puedo tener el archivo que tenía el error en el mensaje de excepción real – ganders

Respuesta

8

Cambié la nueva excepción para aceptar ex como la excepción interna en lugar de ex.InnerException. Si llama a ToString() en su nueva instancia de excepción, incluirá el seguimiento completo de la pila y todas las excepciones internas.

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

Gracias @jrummell – ganders

Cuestiones relacionadas