gpt4 book ai didi

c# - KeyNotFoundException 信息

转载 作者:太空狗 更新时间:2023-10-29 22:20:22 28 4
gpt4 key购买 nike

我有一个随机抛出“KeyNotFoundException”的 C# Silverlight 应用程序。我不知道找不到什么 key 。这让我想到了两个问题:

  1. KeyNotFoundException 是否存储/公开它试图找到的 key ?当我查看 documentation , 我没有看到任何暗示此信息可用的信息。
  2. 我在一般的 Application.UnhandledException 事件处理程序中捕获/记录此异常。我的问题是,如果我在这里捕获事件,我是否可以将 ExceptionObject 转换为 KeyNotFoundException,并且如果它按照 #1 中的要求公开,我仍然可以获得关键信息?

非常感谢您的帮助!

最佳答案

当字典抛出 KeyNotFoundException 时,它不会尝试告诉您它试图找到哪个键。因此,我通常尝试在我的词典上使用扩展方法,这样如果我的程序中断,我就知道它试图查找的键。虽然了解堆栈跟踪很有帮助,但通常还不够,尤其是在循环内进行查找时。

public static TValue GetOrThrow<TKey,TValue>(this IDictionary<TKey,TValue> d, TKey key)
{
try
{
return d[key];
}
catch(KeyNotFoundException ex)
{
throw new KeyNotFoundException(key.ToString()
+ " was not found in the dictionary");
}
}

更新/澄清

我实际上并没有调用 key.ToString(),因为它可能是一种不会覆盖 ToString() 的类型。默认会打印类型名称:"MyLibrary.SomeType was not found.",这不如 "{ managerId: 123, employeeId: 456} was not found.".

因此,我将它序列化为 json,如下所示:

var serializedKey = Newtonsoft.Json.JsonConvert.SerializeObject(
key,
new JsonSerializerSettings
{
//make it easy for humans to read
Formatting = Formatting.Indented,
//don't break on loops...that would cause a new error that hides the KeyNotFound!
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});

此外,我发现将特定键值放入异常消息中会使在日志中汇总异常变得困难,具体取决于您使用的工具类型。 (我正在使用一种根据外部异常消息 对错误进行分组的方法)。如果这对您有影响,您可能希望将详细信息放在内部异常中:
抛出新的 KeyNotFoundException(
“找不到 key ”,
新的 KeyNotFoundException(serializedKey));

关于c# - KeyNotFoundException 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com