在保持堆栈跟踪和内部异常信息的同时抛出新的异常

时间:2012-01-13 19:20:13

标签: c# exception exception-handling

我有一个我正在处理的FileSystemWatch程序,如果复制文件时出错,我希望能够知道它失败了哪个文件。同时,我希望能够保留堆栈跟踪以及内部异常信息。

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

所以,传递的异常,我仍然想要堆栈跟踪信息,内部异常信息,但我希望“消息”是我的自定义消息,包含它失败的文件,同时还显示原始异常抛出的“真实”消息。

1 个答案:

答案 0 :(得分:9)

我更改了新异常以接受ex作为内部异常而不是ex.InnerException。如果在新的异常实例上调用ToString(),它将包括完整的堆栈跟踪和所有内部异常。

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