我有一些代码可以读取10个注册表项,有时这些值不存在,有时键不存在,有时值不是布尔值等等。我应该如何添加错误处理,目前放在一个很大的尝试{} catch {}但是如果我读取的第二个值失败,那么其余的都没有被读取,因为程序跳转到catch {},我可以为每个添加一个try {} catch {}但我猜它有更好的方法。你会怎么处理这个?我问,因为我经常遇到类似的问题,我自己的解决方案是添加try {} catch {}。
感谢您的帮助。
答案 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对象来存储和检索与异常相关的补充信息。该信息采用任意数量的用户定义键/值对的形式。每个键/值对的关键组件通常是标识字符串,而该对的值组件可以是任何类型的对象。