5

我有一个正在使用的客户端/服务器包,我正在尝试使用 Exception.Data 将自定义信息传递到一个单独的类 (ExceptionError) 以传递到 MessageBox。

当我尝试连接到服务器而不实际启动服务器以侦听连接时,以下捕获过程。只是对那部分的疏忽,监听连接并不是真正的问题,但它向我展示了 Exception.Data 的问题。

catch (Exception e)
{
    e.Data["SourceFile"] = "Client.cs";
    e.Data["MethodName"] = "Send_CommandToServer";
    e.Data["ExceptionType"] = "Exception";
    object[] exceptionArgs = new object[8] { null, e.InnerException, 
                              e.Message, null, e.Source, e.StackTrace, 
                              e.TargetSite, e.Data };
    ExceptionError.Show(exceptionArgs);
}

这是抛出 InvalidCastException 的 ExceptionError 类中的行:

Dictionary<string,string> data = (Dictionary<string, string>)exceptionArgs[7];
 // exceptionArgs[7] is Exception.Data

这是我收到的实际错误:

无法将“System.Collections.ListDictionaryInternal”类型的对象转换为“System.Collections.Generic.Dictionary`2[System.String,System.String]”类型。

我找不到任何关于 ListDictionaryInternal 的信息,我所做的大多数谷歌搜索都指向 System.Collections.Specialized.ListDictionary,它会产生自己的问题。有谁知道 ListDictionaryInternal 或者你能帮我将 e.Data 传递给我的 ExceptionError 类吗?

4

2 回答 2

12

基本上, 的值Exception.Data不是Dictionary<string, string>- 所以当你它转换为时Dictionary<string, string>,你会得到这个异常。

属性本身仅被声明为 type IDictionary。你不应该假设它是一个Dictionary<string, string>. 您应该修复您的ExceptionError课程以避免这种假设。据记录,键通常是字符串,但这不能保证 - 同样不能保证值是字符串。

您可以通过仅转换适当的条目IDictionary来执行“安全”转换:Dictionary<string, string>

var dictionary = original.Cast<DictionaryEntry>()
                         .Where(de => de.Key is string && de.Value is string)
                         .ToDictionary(de => (string) de.Key,
                                       de => (string) de.Value);
于 2013-10-06T11:30:21.147 回答
2

Exception.Data的类型(和记录)为IDictionary. 另外,不要把它塞进object[]. 相反,保留类型信息并将其作为形式参数发送到ExceptionError.Show.

于 2013-10-06T11:29:52.947 回答