[英]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.