如何在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);
                }
            }

如何在SaveChanges()上捕获多个异常,或者是否可能

您需要自定义继承exception的异常。在这个异常中,你有一个属性,例如Errors。此属性将是消息集合。

当您尝试保存更改时,您应该知道您期望的字段类型。您应该在其他类中定义字段的边界(例如Price->decimal, mandatory, maxValue等)在保存时,您应该检查边界,如果其中一个不为真,您应该在自定义异常的Errors中添加消息字符串(例如Price不是decimal字段)

如果出现Errors。Count> 0抛出CustomException。您应该在CustomException ->循环所有错误并返回所有错误的文本中重写message属性。最后,您只需要customException。消息,您将有所有的问题显示给用户。

所以当你捕获这样的异常时,你只会捕获第一个异常。当你有一堆异常时,Java不允许你继续运行,并捕获所有的异常。

你可以做的是把整个东西放在一个while循环中,直到你保存了所有的更改。确保在try{}块中迭代每个字段,而不是一次又一次地尝试第一个字段。

相关文章: