如何在SaveChanges()上捕获多个异常,或者是否可能
本文关键字:异常 或者 或者是 是否 SaveChanges | 更新日期: 2023-09-27 18:13:20
我获得一个XML文件(来自infopath表单),创建一个对象并将该对象插入到DB中。我使用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);
}
}
您需要自定义继承exception的异常。在这个异常中,你有一个属性,例如Errors。此属性将是消息集合。
当您尝试保存更改时,您应该知道您期望的字段类型。您应该在其他类中定义字段的边界(例如Price->decimal, mandatory, maxValue等)在保存时,您应该检查边界,如果其中一个不为真,您应该在自定义异常的Errors中添加消息字符串(例如Price不是decimal字段)
如果出现Errors。Count> 0抛出CustomException。您应该在CustomException ->循环所有错误并返回所有错误的文本中重写message属性。最后,您只需要customException。消息,您将有所有的问题显示给用户。
所以当你捕获这样的异常时,你只会捕获第一个异常。当你有一堆异常时,Java不允许你继续运行,并捕获所有的异常。
你可以做的是把整个东西放在一个while循环中,直到你保存了所有的更改。确保在try{}块中迭代每个字段,而不是一次又一次地尝试第一个字段。