如何处理C#中的多个错误?

时间:2008-11-24 22:59:42

标签: c# error-handling try-catch

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

感谢您的帮助。

8 个答案:

答案 0 :(得分:2)

首先,吞咽异常通常是一个坏主意 - 您是否可以编写一个方法来检查密钥等是否存在,并返回值,如果有的话?

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

SomeReturnType foo = HackyMethod(first path);
SomeReturnType bar = HackyMethod(sedond path);

SomeReturnType HackyMethod(string path)
{
    try {} catch {} etc
}

答案 1 :(得分:1)

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);
   } 
}

答案 2 :(得分:1)

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

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

此处的最后一个参数是指定的默认值,如果找不到值名称则返回。我把它变成了一个空白字符串,但是你可以把它改成你想要的任何东西。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这取决于错误的严重程度。如果查找的某些键缺失或类型错误,程序是否继续有意义且有用?有些钥匙比其他钥匙更重要吗?

我建议如下:

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

  

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