[英]How to handle multiple errors in C#?
我有一些代碼讀取10個注冊表項,有時值不存在,有時鍵不存在,有時值不是布爾等等。我應該如何添加錯誤處理,目前它放在一個大的嘗試{} catch {}但是如果我讀取的第二個值失敗,那么其余的都沒有被讀取,因為程序跳轉到catch {},我可以為每個添加一個try {} catch {}但我猜有更好的方法。 你會怎么處理這個? 我問,因為我經常遇到類似的問題,我自己的解決方案是添加一個try {} catch {}。
謝謝您的幫助。
首先,吞咽異常通常是一個壞主意 - 你不能寫一個方法來檢查密鑰等是否存在,並返回值,如果一個?
如果絕對不可能,那么你可以將代碼重構為對單個方法的多次調用(對於每個方法)執行try / catch(swallow):
SomeReturnType foo = HackyMethod(first path);
SomeReturnType bar = HackyMethod(sedond path);
SomeReturnType HackyMethod(string path)
{
try {} catch {} etc
}
Dictionary<String,String> regKeys = new Dictionary<String,String>()
{
{ "Key1", String.Empty},
{ "Key2", String.Empty},
{ "Key3", String.Empty}
};
for (int i = 0; i < regKeys.Length; i++)
{
try
{
regKeys[i].Value = ReadFromRegistry(regKeys[i].Key);
}
catch (Exception ex)
{
Console.WriteLine("Unable to read Key: " + regKeys[i].Key
+ " Exception: " + ex.Message);
}
}
你是如何閱讀注冊表值的? Registry類(Microsoft.Win32.Registry)允許您讀取注冊表值並返回您指定的默認值(如果值/名稱對不存在),如下所示:
object o = Microsoft.Win32.Registry.GetValue(
@"HKEY_CURRENT_USER\Software\Microsoft\Calc", "layout", "");
這里的最后一個參數是指定的默認值,如果找不到值名稱則返回。 我把它變成了一個空白的字符串,但你可以把它改成你喜歡的任何東西。
將讀取值的代碼重構為自己的函數,以處理錯誤的處理方式。
基本上,是的,您希望在每個單獨的元素上定義錯誤處理,而不是在元素集上定義錯誤處理。 也就是說,如果您希望捕獲每個錯誤但不會導致進程中止,則應對每個單獨的元素執行錯誤處理,而不是對整個組執行錯誤處理。
這取決於錯誤的嚴重程度。 如果查找的某些鍵缺失或類型錯誤,程序是否繼續有意義且有用? 有些鑰匙比其他鑰匙更重要嗎?
我建議如下:
找到你必須擁有的所有密鑰,並將它們放在一個try {}中,catch {}報告致命錯誤並啟動清理。 首先執行此塊。
找到所有可選鍵並將它們放在各自的try {}塊中,這樣您就可以恢復並繼續使用其他鍵。 為了使這更簡單,您可以添加一個包裝器方法,該方法具有必要的try / catch塊和錯誤檢查,並將鍵名作為參數。
編輯:改變了一切。 :PI提出了一個結構或類(以前),但現在我將其更改為一個簡單的字符串集合。
一些pseduo代碼在我的頭頂....
public IEnumerable<string> ReadRegistryKeys()
{
IEnumerable<string> resultList = new List<string>();
if (string.IsNullOrEmpty(read_in_key_#1())
{
resultList.Add("Failed to load key 'blah'..");
}
if (.... read in the next key .. etc.... ) ...
return resultList == null || resultList.Count <= 0 ? null : resultList;
}
如果您願意,也可以使用StringCollection(System.Collections.Specialized?)。
@ Marc的答案是最好的,但是如果你絕對必須有一個包含有錯誤的注冊表項集合的激活,你應該使用異常的Data屬性來查看。 從此屬性的MSDN文檔,
使用Data屬性返回的System.Collections.IDictionary對象來存儲和檢索與異常相關的補充信息。 該信息采用任意數量的用戶定義鍵/值對的形式。 每個鍵/值對的關鍵組件通常是標識字符串,而該對的值組件可以是任何類型的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.