簡體   English   中英

如何處理C#中的多個錯誤?

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

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