【问题标题】:How to get error message when no way debugging无法调试时如何获取错误消息
【发布时间】:2015-03-05 19:15:46
【问题描述】:

我在我的应用程序中使用 EF,但它正在引发异常

System.Data.Entity.Validation.DbEntityValidationException:一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。在 System.Data.Entity.Internal.InternalContext.SaveChanges() 在 Capture.Controllers.HomeController.AddFirstVisit(Int32 companyId)

我可以看到我需要做什么才能了解​​该错误 - 我需要查看 EntityValidationErrors 但问题是我无法调试 - 代码需要在服务器上运行,因此在本地运行不会重现此错误.

我遇到的问题是,在没有看到对象的情况下,如何将 execption 作为字符串取出?

目前我使用catch(Exception e) 并将e.ToString() 传递给我的日志引擎。

如何传递错误详细信息?我希望像

catch(Exception e)
{
    e.innerException.EntityValidationErrors; // what should this be
}

这几乎有答案EF Code First: How do I see 'EntityValidationErrors' property from the nuget package console?,但我没有得到e.EntityValidationErrors的选项

【问题讨论】:

  • 多么棒的答案
  • 不确定是不是讽刺哈哈。您是否使用特定的日志记录框架?有些内置了此功能
  • @JNYRanger,不是讽刺,我不是典型的 SO 用户!! :) 我不知道你可以远程调试,它比你更真实
  • 您可能还想考虑减少一些日志引擎,例如 Elmah,并停止以您正在执行的方式捕获和记录消息。在大多数情况下,堆栈跟踪至少同样重要。 hanselman.com/blog/…

标签: c# .net entity-framework


【解决方案1】:

假设Log(string) 记录到您的日志引擎:

catch (DbEntityValidationException ex)
{
   foreach (var evr in ex.EntityValidationErrors)
   {
      foreach (var error in evr.ValidationErrors)
      {
         Log(error.PropertyName + ": " + error.ErrorMessage);
      }
   }   
}

【讨论】:

    【解决方案2】:

    我创建了一个类来处理模型状态错误。

    public class Message
        {
            public string Title { get; set; }
            public string Mensagem { get; set; }
            public List<string> Itens { get; set; }
            public string itensRetorno { get; set; }
    
            public Message()
            {
                this.Itens = new List<string>();
            }
    
            public void Add(string item)
            {
                this.Itens.Add(item);
            }
    
            public string GetMessages()
            {
                var MsgItens = string.Empty;
    
                foreach (var item in this.Itens)
                {
                    MsgItens += "<li>" + item + "</li>";
                }
    
                this.itensRetorno = MsgItens;
    
                return MsgItens;
            }
    
    
    public static class ModelStateUtils
        {
            public static Message GetModelStateErrors(ModelStateDictionary modelState)
            {
                Message msg = new Message();
    
                List<string> errorKeys = new List<string>();
    
                int index = 0;
    
                foreach (var val in modelState.Values)
                {
                    if (val.Errors.Count() > 0)
                    {
                        msg.Itens.Add(modelState.Keys.ElementAt(index));
                    }
    
                    index++;
                }
    
                msg.Title = "Erro";
                msg.Mensagem = "Os seguintes campos são obrigatórios<br />" + msg.GetMessages();
    
                return msg.Itens.Count() > 0 ? msg : null;
            }
        }
    

    【讨论】:

      【解决方案3】:

      首先捕获更具体的异常:

      catch(DbEntityValidationException e)
      {
          // Do something with e.EntityValidationErrors; 
      }
      catch(Exception e)
      {
          // Do whatever you were already doing with the generic exception
      }
      

      【讨论】:

        猜你喜欢
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多