使用Assert时C#抛出异常?

时间:2010-04-27 18:38:23

标签: c# exception-handling

我有一个系统,其中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);  
}  

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

我喜欢它,因为它很整洁,因为我不喜欢在类范围内查看“抛出新异常(”bla bla bla“)类型的消息。

4 个答案:

答案 0 :(得分:5)

通常,您应该只在例外情况下抛出异常。由于这种情况,抛出异常是正确的做法。

答案 1 :(得分:4)

这取决于Assert的含义。

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

但是如果我们假设你的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);
}

答案 2 :(得分:1)

使用例外,它们的用途 - 特殊情况。 所有标准的.NET库都使用这种处理这种情况的方法,所以从微软那里获取线索。

答案 3 :(得分: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。