c# - 抛出异常是一个好习惯吗?

标签 c# asp.net

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

5年前关闭。




Improve this question




考虑一个示例,其中用户使用两个 aspx 页面中的表单为客户对象输入值。对于第一种方法,在调用构造函数之前,两个 aspx 页面都需要验证 ID 是否大于 0 并且 FirstName 不为空。使用第二个选项,两个页面都可以调用 Validate 函数并向用户显示错误消息。

基于上面的例子,我更喜欢第二个选项。然而,当我在网上研究时,我一直看到它更面向对象,立即抛出异常而不是让对象接受无效数据。正如我之前所说的,除了异常(exception),调用此构造函数的每个页面都需要验证输入是否有效。我不喜欢重复逻辑,所以我更喜欢第二种选择。

领域驱动设计的首选方案是什么?

选项1

public class Customer{

   public int ID { get; set; }
   public string FirstName { get; set; }

   public Customer(int ID, string FirstName){
      if (ID < 0)
          throw new Exception("ID cannot be less than 0");
      if (string.IsNullOrEmpty(FirstName))
          throw new Exception("First Name cannot be empty");

      this.ID = ID;
      this.FirstName = FirstName;
   }
}

选项 2
public class Customer{

   public int ID { get; set; }
   public string FirstName { get; set; }

   public Customer(int ID, string FirstName){

      this.ID = ID;
      this.FirstName = FirstName;

   }

    public List<string> Validate(){
        List<string> ErrorMessages = new List<string>();

        if (ID < 0)
            ErrorMessages.Add("ID cannot be less than 0");
        if (string.IsNullOrEmpty(FirstName))
            ErrorMessages.Add("First Name cannot be empty");

        return ErrorMessages;
    }

}

最佳答案

我确信这个问题已经在别处得到了回答。但这里有一些其他的阅读链接:

  • Best practices for catching and re-throwing .NET exceptions
  • When to throw an exception?

  • 从“The Pragmatic Programmer”一书中,与异常用法有关的大问题是“什么是异常?”。

    在该部分,我引用:

    ... exceptions should rarely be used as part of a program's normal flow; exception should be reserved for unexpected events.



    虽然在您的情况下是否使用异常是有争议的,但我会说不 - 因为您可能需要在一个请求中捕获所有可能的输入错误并反射(reflect)在表单上,​​以便用户更正这些值。

    现在回想起来,你应该在这里使用异常。这就是您防御性编码的方式。如果您已经期望将有效参数传递到 Customer类,然后代码应该抛出异常以防止类的无效使用(例如,由另一个程序员)。在这种情况下,您应该有另一个输入验证器来验证用户对应用程序的输入,然后才能到达 Customer类(class)。

    关于c# - 抛出异常是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37336192/

    相关文章:

    asp.net - ASPxComboBox - 如何设置所选项目?

    asp.net - IIS - 获取 CloudFlare 背后的真实 IP 地址?

    c# - 从基于索引的正则表达式中获取反向引用基于名称的正则表达式

    c# - C++ 中的 Action 类? (相当于 C#)

    c# - 创建一个没有条目接触磁盘的 ZIP 文件?

    c# - 如何从服务器加载 pdf 作为 aspx 页面(或安全加载 pdf 文件)?

    c# - 类型 'DefaultInlineConstraintResolver' 的内联约束解析器无法解析以下内联约束 : 'apiVersion'

    c# - 为什么为资源文件生成的类在具有不同名称的文件中?

    c# - 我们如何在 wpf 中使用数据网格?

    c# - 检测 AppData\LocalLow 的位置