如何在不丢失C#中的任何信息的情况下向异常添加消息?

Cod*_*man 56 c# exception-handling exception

我有以下代码:

catch(Exception ex)
{
    throw new FatalException("An error occurred while trying to load the XSLT file.", ex);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只是吞噬了异常.我可以通过执行以下操作来解决此问题:

catch(Exception ex)
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

但我仍然希望包含自定义消息以获取有关事件记录的帮助.

如何在不丢失任何信息的情况下将此消息添加到异常中?(堆栈跟踪/调试符号等)

com*_*ech 71

如果您只需要向原始异常添加信息,例如用户可读消息或对您追踪错误但对最终用户无用的特定详细信息,则可以使用Exception的Data属性,它是一个键/值对字典.

我们广泛使用它来记录诸如正在执行的报告或正在处理的文件之类的信息,以便操作可以确定错误发生时到底发生了什么.用户不需要此详细信息,因为他们直接处理故障原因.

您还可以使用它来传递对用户有意义的纯文本消息.唯一的问题是您必须在日志框架或最终用户界面中执行一些额外的工作,以便提取数据并使其对消费者有用.

例如,您可以这样做:

catch (Exception ex)
{
    ex.Data.Add("UserMessage", "An error occurred while trying to load the XSLT file.");
    throw;
}
Run Code Online (Sandbox Code Playgroud)

然后在客户端代码中,您可以测试以查看UserMessage是否存在,如果存在,则将其呈现给用户而不是Exception:

catch (Exception ex)
{
    if (ex.Data.Contains("UserMessage"))
    {
        MessageBox.Show(ex.Data["UserMessage"].ToString());
    }
    else
    {
        MessageBox.Show(ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是`ex.Data ["UserMessage"] + ="发生错误...";`这样如果某些较低级别的代码已经添加了一条消息,它会将额外的文本追加到它而不是抛出[ `ArgumentException`](http://msdn.microsoft.com/en-us/library/system.collections.idictionary.add(v = vs.110).ASPX#ddueExceptionsToggle) (6认同)

kri*_*gar 15

那个原始的例外仍然存在.

当您执行异常日志记录时,您收到的异常将是您使用消息进行的FatalException.最初的例外是在ex.InnerException.您可以继续循环遍历InnerException,直到它为null,以获取所有堆栈跟踪信息等.