gpt4 book ai didi

c# - 记录任何类型异常的所有异常信息

转载 作者:太空狗 更新时间:2023-10-29 23:30:38 28 4
gpt4 key购买 nike

我正在使用 C#、ASP.NET MVC Web Api、Entity Framework 和 .NET Framework 4.0 进行开发。

我有这段代码来记录异常:

public void LogCompleteException(
string controllerName,
string actionName,
Exception exception)
{
string exceptionMessage = string.Empty;

Exception e = exception;
if (e.InnerException == null)
e = null;
else
while (e.InnerException != null) e = e.InnerException;

if (e == null)
exceptionMessage = exception.Message;
else
exceptionMessage = string.Format("{0}\n\rInnerException: {1}", exception.Message, e.Message);

_logger.ErrorFormat(
LogTextFormatString,
ExceptionText,
controllerName,
actionName,
exceptionMessage);
}

但是在我的日志文件中我发现了这个:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

当我写“查看‘EntityValidationErrors’属性以获取更多详细信息”时,我只是展示了一个示例,其中我没有记录重要的属性。

有很多种异常(exception);但是使用我的方法我没有记录所有相关信息,因为可能存在我没有记录的属性,例如“EntityValidationErrors”。

当我通过异常来记录它时,我不知道它有什么属性,也不知道如何记录它的每个属性。

你知道一个完整记录异常的方法吗?我的代码不会出现带有 EntityValidationErrors 属性或任何其他重要属性的异常。

我正在使用 log4net 进行日志记录。

最佳答案

由于内部异常本身就是一个异常,也许您可​​以递归并重用您已有的方法:

if (e.InnerException != null)
{
LogCompleteException(controllerName, actionName, e.InnerException);
}

但是,如果这确实有效,您仍然会丢失 EntityValidationErrors。

我最近使用的另一种方法是在异常发生的地方显式地捕获和记录异常:

try
{
db.Add(something);
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
StringBuilder sb = new StringBuilder();

// collect some extra info about the exception before logging
foreach (var eve in ex.EntityValidationErrors)
{
sb.AppendLine(String.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State));
foreach (var ve in eve.ValidationErrors)
{
sb.AppendLine(String.Format("Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage));
}
}

logger.Error("There was an error while trying to parse and save something!\n" + sb.ToString(), ex);
}

如果您想要 Exception.Data 字典条目,您也可以添加它们:

foreach (DictionaryEntry entry in ex.Data)
{
// you will want to use a StringBuilder instead of concatenating strings if you do this
exceptionMessage = exceptionMessage + string.Format("Exception.Data[{0}]: {1}", entry.Key, entry.Value);
}

至于自定义异常类的属性,就像 EntityValidationErrors,我只会在它们出现的地方捕获和解析它们。否则,您将不得不在每个异常类型上覆盖 ToString() 或使用一些反射 hackery 来枚举所有属性,这会使日志中包含您不关心的属性,从而使日志变得困惑。

关于c# - 记录任何类型异常的所有异常信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29797364/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com