簡體   English   中英

使用Assert時C#拋出異常?

[英]C# Throw Exception on use Assert?

我有一個系統,其中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#語言中是否可以接受?

我喜歡它,因為它很整潔,因為我不喜歡在類范圍內查看“拋出新異常(”bla bla bla“)類型的消息。

通常,您應該只在特殊情況下拋出異常。 由於這種情況,拋出異常是正確的做法。

這取決於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);
}

使用例外,它是它們的用途 - 特殊情況。 所有標准的.NET庫都使用這種處理這種情況的方法,所以從微軟那里得到你的暗示。

斷言背后的想法,正如我一直使用的那樣,是在運行調試版本時它們是即時反饋。 發生在你臉上的那種事。 如果應用程序以這種方式設置,則記錄到文件。

如上所述,例外用於處理異常行為。

我所做的,特別是項目生命周期的早期可能是這樣的:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM