我得到一个XML文件(来自infopath表单),创建一个对象并将该对象插入到数据库中。我使用C#webservice进行此解析,如果成功则返回true,如果SaveChanges()失败,它返回异常消息。我想要返回的主要异常是DbEntityValidationExceptions,因为我将以不同方式处理其他异常。有些列具有最大长度,因此字段超出了我想要返回需要编辑的字段名称。我是否可以捕获所有失败的字段的DbEntityValidationException,或者实体只抛出第一个异常然后回滚事务?对于200个字段,告诉用户他们需要更改哪些字段而不是第一个字段然后继续失败,因为他们每次都修复了单个异常。
如果不可能,我建议的解决方案无关紧要,应予以删除。如果可以返回所有异常,我做错了什么?
exceptionList = new List<string>();
try
{
db.SaveChanges();
}
catch (Exception ex)
{
if (ex.GetType() == new DbEntityValidationException().GetType())
{
DbEntityValidationException eValidEx = (DbEntityValidationException) ex;
foreach (DbEntityValidationResult vResult in eValidEx.EntityValidationErrors)
{
foreach (DbValidationError vError in vResult.ValidationErrors)
{
exceptionList.Add(vError.ErrorMessage);
}
}
result = false;
}
else
{
exceptionList.Add("Unknown. " + ex.Message);
}
}
答案 0 :(得分:0)
因此,当您捕获类似的异常时,您将只捕获第一个异常。当你有一堆例外并抓住所有例外时,Java不会让你继续下去。
你能做的就是将整个事情放在一个循环中,直到你保存了所有的变化。确保在try {}块中迭代遍历每个字段,而不是一次又一次地尝试第一个字段。
答案 1 :(得分:0)
您需要继承Exception的自定义异常。在此异常中,您具有属性,例如错误。此属性将是消息集合。
当您尝试保存更改时,您应该知道您期望的字段类型。你应该在字段的其他类边界中定义(例如Price-&gt; decimal,mandatory,maxValue等)在保存时你应该检查边界,如果其中一个不是真的你应该在自定义异常的错误中添加消息字符串(示例价格不是十进制字段)
最后,如果Errors.Count&gt; 0 Thorw CustomException。您应该覆盖CustomException中的message属性 - &gt;循环所有错误并返回所有错误的文本。最后,您只需要customException.Message,您将向用户显示所有问题。
我希望这有帮助。