C# 在使用 Assert 时如何抛出异常?

6
我有一个系统,员工ID必须始终存在,除非存在某些根本性问题。
我认为,我有两个选择来检查这个代码:
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“)”类型的消息。

1
为什么不直接让您的VerifyIdExists方法代表您抛出异常呢? - Tejs
除了我个人认为应该将名称更改为ThrowIfNotFound之外,我认为你的代码没有任何问题。我理解这是你想在发布版本和调试版本中都包含的功能。 - Chris Taylor
4个回答

5

通常情况下,你应该只在异常情况下抛出异常。由于这是一个这样的情况,抛出异常是正确的做法。


4

这取决于你对 Assert 的理解。

你可以使用 Debug.Assert (或者如果你希望它在发布模式下也能工作,可以使用Trace.Assert)。然而,这并不是很有用,因为它会停止程序并弹出一个对话框,直到用户按下某个按钮。这对于未受监控的系统来说不太好。因此,在大多数情况下,我建议抛出异常,因为你可以决定如何响应错误-停止程序,或者只记录并尝试继续。

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

事实上,以 Jon Skeet 的morelinq 为例,两种方法都被使用了。例如在这里

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);
}

1
是的,我的断言是用于“抛出异常”的。谢谢j。 - guazz
@guazz:第一次阅读你的问题时,我以为你在比较抛出异常和断言 - 从其他答案和投票结果来看,大家也是这样认为的。你可能需要重新措辞你的问题,让它更清晰明了。 - Mark Byers
参数异常的扩展方法? - Chris Marisic
@Chris Marisic:是的,ThrowIfNull是一个扩展方法。它在这个文件中实现:http://code.google.com/p/morelinq/source/browse/tags/1.0-beta/MoreLinq/ThrowHelper.cs - Mark Byers

1

使用异常,这就是它们存在的原因 - 异常情况。 所有标准的.NET库都使用这种处理异常情况的方法,所以可以从微软那里获取指导。


0

断言的理念,就如我一直使用它们的方式,是在运行调试版本时提供即时反馈。有点像是面对面地告诉你发生了什么事情。或者如果应用程序设置了这样的方式,记录到文件中。

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

尤其是在项目生命周期的早期阶段,我可能会做一些像这样的事情:

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重构出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接