我有一個Dictionary<string, T>
私有字段(users
),其中string
鍵代表用戶名。我爲這個類寫了一些方法,例如GetValue(string userid)
方法返回與指定用戶名關聯的T
對象。處理自定義類中的異常
我會處理這個類中可能出現的異常,這些異常是由Dictionary引起的。例如:
- 如果指定鍵爲空,則
Dictionary
拋出ArgumentNullException
; - 如果指定的鍵不存在於
Dictionary
中,則會拋出KeyNotFoundException
。
的第一種方法可以趕上由Dictionary
拋出的異常,並重新拋出同樣的例外或拋出自定義異常。
public T GetValue(string userid)
{
try
{
return users[userid];
}
catch(ArgumentNullException ex1)
{
// re-throw the same exception
}
catch(KeyNotFoundException ex2)
{
throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
}
的第二種方法可避免捕捉異常,但檢查導致他們的條件,並拋出適當的例外。
public T GetValue(string userid)
{
if (userid != null)
{
if(users.ContainsKey(userid))
return users[userid];
else throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
else throw new ArgumentNullException(...);
}
的第三種方法是類似於第二之一,但它使用了Dictionary
的TryGetValue
方法。
public T GetValue(string userid)
{
if (userid != null)
{
T value;
if(users.TryGetValue(userid, out value))
return value;
else throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
else throw new ArgumentNullException(...);
}
每種方法的優點和缺點是什麼? 的best practices for handling exceptions說:
如果該事件是真正的例外,是錯誤的,因爲使用更少的代碼在正常情況下,執行異常 處理比較好... 如果事件發生日常使用編程的方法來檢查 錯誤比較好...
在我的情況下GetValue(string userid)
方法將被調用很少,但是類的潛在用戶可以使用它非常頻繁。