相关疑难解决方法(0)

为什么说Exceptions对于输入验证是如此糟糕?

据我所知,"例外是特殊情况下" [1],但除了只是被重复一遍,我从来没有发现这一事实的实际原因.

作为他们停止执行,这是有道理的,你会不会希望他们为平原的条件逻辑,但为什么不输入验证?

假设你通过一组输入是循环和捕捉每个异常将它们组合在一起的用户通知...我不断地看到,这是某种"错误的",因为用户输入不正确输入所有的时间,但是这点似乎是基于在语义上.

输入不是预期的,因此是例外.抛出一个异常,让我解释清楚到底发生了什么事像StringValueTooLong或或IntegerValueTooLow或InvalidDateValue或什么的.为什么这被认为是错的?

替代抛出一个异常,将回移(最终收集)错误代码或差远了错误的字符串.然后我会直接显示这些错误字符串,或者解析错误代码然后向用户显示相应的错误消息.不会将异常视为可延展的错误代码吗?为什么要创建的错误代码和消息一个单独的表,当这些可以与例外的功能被推广已经内置到我的语言?

另外,我发现Martin Fowler的这篇文章是关于如何处理这些事情 - 通知模式.我不确定我是如何将此视为除了不停止执行的异常之外的任何东西.

a:我到处都读过有关例外的内容.

---编辑---

已经提出了许多重点.我对大多数事情都有评论,而且还有优点,但我还不完全相信.

我并不是要提倡将Exceptions作为解决输入验证的正确方法,但我想找到很好的理由,为什么这种做法被认为是如此邪恶,因为似乎大多数替代解决方案只是伪装的例外.

validation error-handling exception

48
推荐指数
6
解决办法
1万
查看次数

根据外部因素验证对象(即数据存储唯一性)

描述

我的解决方案有这些项目:

  • DAL =修改后的实体框架
  • DTO =能够验证自己的数据传输对象
  • BL =业务层服务
  • WEB =演示Asp.net MVC应用程序

DAL,BL和WEB都参考了很棒的DTO.
该过程通常以这种方式执行:

  1. 向WEB发出Web请求
  2. WEB获得DTO发布
    • DTO通过自定义ActionFilter自动验证
    • 验证错误是自动收集的
  3. (验证是可以的)WEB调用BL提供DTO
  4. BL通过使用DTO调用DAL(可以通过它们或只是使用它们)

那么DTO验证问题......

我的DTO能够根据自己的状态(属性值)验证自己.但是现在我遇到了问题,但事实并非如此.我需要他们使用BL(以及因此DAL)进行验证.

我的现实生活中的例子:用户注册和WEB获得验证的用户DTO.有问题的部分是username验证.应根据数据存储检查其唯一性.
我该怎么做?

还有其他信息表明所有DTO都实现了IoC和TDD 的接口(即UserDTO实现IUser).两者都是DTO项目的一部分.

不可能尝试

  1. 我无法在DTO中引用BL,因为我将获得循环引用.
    Compilation error
  2. 我无法创建一个额外的DTO.Val项目,它将引用部分DTO类并在那里实现它们的验证(它们引用BL + DTO).
    Partial classes can't span assemblies.

可能的尝试

  1. 创建一个特殊的ActionFilter,可以根据外部条件验证对象.这个将在WEB项目中创建,因此可以看到将在此处使用的DTO和BL.
  2. 将DTO放在BL中并将DTO接口保持为其他项目引用的实际DTO,并重构所有代码以使用接口而不是具体类.
  3. 不处理外部依赖验证,并让外部依赖项抛出异常 - 可能此问题的最糟糕的解决方案

你会建议什么?

validation asp.net-mvc xval data-annotations

10
推荐指数
2
解决办法
5042
查看次数

C#/面向对象设计 - 维护有效的对象状态

在设计一个类时,应该将逻辑维护有效状态合并到类中还是外部?也就是说,属性是否应该在无效状态上抛出异常(即值超出范围等),还是应该在构造/修改类的实例时执行此验证?

c# oop state

2
推荐指数
1
解决办法
2889
查看次数