【问题标题】:How to handle multiple errors in C#?如何处理 C# 中的多个错误?
【发布时间】:2010-09-23 20:49:43
【问题描述】:

我有一些读取 10 个注册表项的代码,有时值不存在,有时键不存在,有时值不是布尔值等。我应该如何为此添加错误处理,目前它被放置在一个大的 try{} catch{} 但如果我读取的第二个值失败,那么当程序跳转到 catch{} 时,其余的都不会被读取,我可以为每个值添加一个 try{} catch{} 但我猜有更好的方法。你会怎么处理这个?我在问,因为我经常遇到类似的问题,我自己的解决方案是添加一个 try{} catch{}。

感谢您的帮助。

【问题讨论】:

    标签: c# error-handling try-catch


    【解决方案1】:

    将读取值的代码重构为它自己的函数,该函数以您希望的方式处理错误。

    【讨论】:

      【解决方案2】:

      首先,吞下异常通常是个坏主意 - 你能不能写一个方法来检查键等是否存在,如果有则返回值?

      如果绝对肯定不可能,您可以将代码重构为对单个方法的多次调用,该方法(对于每个)执行一次 try/catch(吞咽):

      SomeReturnType foo = HackyMethod(first path);
      SomeReturnType bar = HackyMethod(sedond path);
      
      SomeReturnType HackyMethod(string path)
      {
          try {} catch {} etc
      }
      

      【讨论】:

        【解决方案3】:

        基本上,是的,您想定义每个单独元素的错误处理,而不是定义一组元素的错误处理。也就是说,如果您希望捕获每个错误但不导致进程中止,则应该对每个单独的元素执行错误处理,而不是对整个组执行错误处理。

        【讨论】:

          【解决方案4】:

          这取决于错误的严重程度。如果它查找的某些键丢失或类型错误,程序继续运行是否有意义和有用?某些键是否比其他键更重要?

          我建议如下:

          • 找到您拥有拥有的所有键,并将它们放在一个 try{} 中,使用 catch{} 报告致命错误并启动清理。先执行这个块。

          • 找到所有可选键并将它们分别放在各自的 try{} 块中,这样您就可以恢复并继续使用其他键。为了使这更简单,您可以添加一个包装器方法,该方法具有必要的 try/catch 块和错误检查,并将键名作为参数。

          【讨论】:

            【解决方案5】:

            编辑:改变了一切。 :P 我建议了一个结构或类(以前),但现在我将其更改为一个简单的字符串集合。

            一些伪代码从我的脑海中浮现出来......

            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?)。

            【讨论】:

            • 有点题外话,但让它成为一堂课!可变结构?从来不是一个好主意。另外它会过大......
            • 这个问题是你限制自己只返回错误。如果您打算走这条路,我建议将它们链接在字符串构建器中,如果字符串构建器中有任何内容,则抛出异常
            • 我没有将它们放入字符串构建器的原因是如果您希望单独显示每个错误(例如,在某些 HTML 页面上的 UL 中)。如果我不需要,我个人不喜欢例外。因此,在这种情况下,拥有一个期望列表将是一个巨大的矫枉过正。保持简单,伙计们!
            【解决方案6】:
            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);
               } 
            }
            

            【讨论】:

              【解决方案7】:

              您如何读取注册表值? Registry 类 (Microsoft.Win32.Registry) 允许您读取注册表值并在值/名称对不存在时返回您指定的默认值,如下所示:

              object o = Microsoft.Win32.Registry.GetValue(
                  @"HKEY_CURRENT_USER\Software\Microsoft\Calc", "layout", "");
              

              这里的最后一个参数是指定的默认值,如果没有找到值名称则返回。我把它变成了一个空白字符串,但是你可以把它改成任何你喜欢的。

              【讨论】:

              • 注册表键 == 非常邪恶 imo。堵嘴!
              • 该死的 - 我错过了 OP 问题的那一部分。可怜的家伙。
              • 你认为我是在建议使用 Registry 类来处理错误吗?这很有趣。
              【解决方案8】:

              @Marc 的答案是最好的,但如果你绝对必须有一个包含有错误的注册表项集合的单个异常,你应该使用异常的 Data 属性来查看。从这个属性的 MSDN 文档中,

              使用 Data 属性返回的 System.Collections.IDictionary 对象来存储和检索与异常相关的补充信息。该信息采用任意数量的用户定义键/值对的形式。每个键/值对的键组件通常是一个标识字符串,而该对的值组件可以是任何类型的对象。

              【讨论】:

                猜你喜欢
                • 2021-09-22
                • 1970-01-01
                • 2021-01-09
                • 2018-11-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-27
                相关资源
                最近更新 更多