我有一个我正在玩的客户端/服务器包,我试图使用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类吗?
答案 0 :(得分:8)
基本上,Exception.Data
的值不是Dictionary<string, string>
- 因此,当您将投射到Dictionary<string, string>
时,您会收到此异常。
property itself仅声明为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);
答案 1 :(得分:2)
Exception.Data被输入(并记录)为IDictionary
。另外,请勿将其填入object[]
。相反,保留类型信息并将其作为形式参数发送到ExceptionError.Show
。