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

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

  • 非常感谢你的帮助!

    最佳答案

    KeyNotFoundException是由于尝试在不存在键的情况下尝试从具有给定键的字典中获取值而引起的。例如:

    var dictionary = new Dictionary<string, string>();
    var val = dictionary["mykey"];
    

    您可以查看正在使用字典的所有地方并确定自己的位置。通常的最佳做法是,如果您正在字典中寻找一个可能不存在的值,则可以使用TryGetValue。每次都捕获异常是一个更昂贵的操作,并且是不必要的:
    string val;
    if(dictionary.TryGetValue("mykey", out val))
    {
         //The key was found. The value is in val.
    }
    else
    {
        //The key was not present.
    }
    

    您可以查看它们StackTraceKeyNotFoundException属性,以确定问题发生的确切位置。所有异常都具有StackTrace属性,因此您无需关心全局错误处理程序中的异常类型。例如:
    private void Application_UnhandledException(object sender,
            ApplicationUnhandledExceptionEventArgs e)
        {
             var stackTrace = e.ExceptionObject.StackTrace;
             //Log the stackTrace somewhere.
        }
    

    或者,如果您想知道哪种异常类型:
    private void Application_UnhandledException(object sender,
            ApplicationUnhandledExceptionEventArgs e)
        {
             if (e.ExceptionObject is KeyNotFoundException)
             {
                 //This was a KeyNotFoundException
             }
        }
    

    10-04 15:43