【问题标题】:C# Throw Exception on use Assert?C# 使用断言时抛出异常?
【发布时间】:2010-04-27 18:38:22
【问题描述】:

我有一个系统,其中employeeId 必须始终存在,除非存在一些潜在问题。

我的看法是,我有两种选择来检查这段代码:

1:

public void GetEmployee(Employee employee)  
{  
   bool exists = EmployeeRepository.VerifyIdExists(Employee.Id);  
   if (!exists)   
   {   
     throw new Exception("Id does not exist");  
   }  
}    

或 2:

public void GetEmployee(Employee employee)  
{  
  EmployeeRepository.AssertIfNotFound(Employee.Id);  
}  

选项 #2 在 C# 语言中是否可接受?

我喜欢它,因为它很整洁,因为我不喜欢在类范围之外查看“throw new Exception("bla bla bla") 类型的消息。

【问题讨论】:

  • 为什么不让您的 VerifyIdExists 方法代表您抛出异常?
  • 我认为您所拥有的没有任何问题,除了恕我直言,我会将名称更改为 ThrowIfNotFound。我认为这是您希望在发布版本和调试版本中包含的内容。

标签: c# exception-handling


【解决方案1】:

通常,您应该只在异常情况下抛出异常。既然是这种情况,抛出异常是正确的做法。

【讨论】:

    【解决方案2】:

    这取决于您所说的Assert 是什么意思。

    您可以使用Debug.Assert(或Trace.Assert,如果您希望它也可以在发布模式下工作)。然而,这并不是那么有用,因为它会暂停程序并弹出一个对话框,直到用户按下某些东西。这对于不受监控的系统来说不是很好。所以我建议在大多数情况下改为 throw ,因为您可以决定如何对错误做出反应 - 停止程序,或者只是记录并尝试继续。

    但如果我们假设您的 Assert 方法检查其参数并可能引发异常,那么是的,我认为这是一个很好的方法。

    事实上,举个例子,在 Jon Skeet 的morelinq 中,这两种方法都被使用了。例如here:

    public static IEnumerable<TSource> AssertCount<TSource>(
        this IEnumerable<TSource> source, 
        int count,
        Func<int, int, Exception> errorSelector)
    {
        source.ThrowIfNull("source");
        if (count < 0) throw new ArgumentException(null, "count");
        errorSelector.ThrowIfNull("errorSelector");
    
        return AssertCountImpl(source, count, errorSelector);
    }
    

    【讨论】:

    • 是的。我的断言是“抛出异常”。谢谢j。
    • @guazz:我第一次阅读你的问题时,我以为你是在比较 throwing 和 asserting - 从其他答案和投票来看,其他人也是。您可能需要改写您的问题以使其更清楚。
    • 参数异常的扩展方法?
    • @Chris Marisic:是的,ThrowIfNull 是一种扩展方法。在这个文件中实现:code.google.com/p/morelinq/source/browse/tags/1.0-beta/MoreLinq/…
    【解决方案3】:

    使用例外,这是它们的用途 - 特殊情况。 所有标准 .NET 库都使用这种方法来处理这种情况,因此请向 Microsoft 学习。

    【讨论】:

      【解决方案4】:

      断言背后的想法,正如我一直使用的那样,它们是运行调试构建时的即时反馈。你脸上有点像发生了什么事。或者如果应用程序以这种方式设置,则记录到文件中。

      如上所述,异常用于处理异常行为。

      我所做的,尤其是在项目生命周期的早期,可能是这样的:

      public void GetEmployee(Employee employee)  
      {  
         bool exists = EmployeeRepository.VerifyIdExists(Employee.Id);  
         Debug.Assert( exists, "employee does not exist for id: " + Employee.Id );
         if (!exists)   
         {   
           throw new Exception("Id does not exist);  
         }  
      }   
      

      一旦处理了最初的问题,也许会重新生成 Debug.Assert。

      【讨论】:

        猜你喜欢
        • 2011-08-06
        • 2012-04-28
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多