异常的关联性
.Net的异常是否具有相关性? 相关性是指其他模块的错误会造成此模块无法正常工作,且两模块并不存在明显的组合或者包含关系。比如A与B并不直接存在服务与被服务的关系,但A的错误导致B失败了。比如,我在某一处执行了如下语句,得到的错误却很奇怪。
try { var reply = await ping.SendPingAsync(entry.ServerIpAddress, 3000); //. ..... } catch (Exception) { //... }
发生的异常详细信息如下:
配置系统未能初始化 // -Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal} // +InnerException {"无法识别的配置节 configuration。 (\\bin\\Debug\\Com.***.vshost.exe.Config line 6)"} System.Exception {System.Configuration.ConfigurationErrorsException} // StackTrace: 在 System.Configuration.ConfigurationManager.PrepareConfigSystem() 在 System.Configuration.ConfigurationManager.GetSection(String sectionName) 在 System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName) 在 System.Net.Configuration.SettingsSectionInternal.get_Section() 在 System.Net.Sockets.Socket.InitializeSockets() 在 System.Net.IPAddress.InternalParse(String ipString, Boolean tryParse) 在 System.Net.NetworkInformation.Ping.SendAsync(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options, Object userToken) 在 System.Net.NetworkInformation.Ping.SendAsync(String hostNameOrAddress, Int32 timeout, Object userToken) 在 System.Net.NetworkInformation.Ping.<>c__DisplayClass58_0.<SendPingAsync>b__0(TaskCompletionSource`1 tcs) 在 System.Net.NetworkInformation.Ping.SendPingAsyncCore(Action`1 sendAsync) 在 System.Net.NetworkInformation.Ping.SendPingAsync(String hostNameOrAddress, Int32 timeout) 在 Com.****.CommnadFunctionCollection.<>c__DisplayClass0_0.<<Ping>b__1>d.MoveNext() 位置 ***\Commands\CommnadFunctionCollection.cs:行号 50
但Ping.SendPingAsync(....)返回为Task,并不直接抛出异常,而是将异常存储在Task中。也就是说,此函数并不发生错误,Task是自描述的。
// // 摘要: // 使用指定的数据缓冲区将 Internet 控制消息协议 (ICMP) 回送消息发送到具有指定的 System.Net.IPAddress 的计算机,并从该计算机接收对应的 // ICMP 回送答复消息以作为异步操作。 此重载使您可以为操作指定一个超时值。 // // 参数: // address: // 一个 IP 地址,它标识作为 ICMP 回送消息目标的计算机。 // // timeout: // (发送回送消息后)等待 ICMP 回送答复消息的最大毫秒数。 // // 返回结果: // 返回 System.Threading.Tasks.Task`1。 表示异步操作的任务对象。 public Task<PingReply> SendPingAsync(IPAddress address, int timeout);
那这个错误是哪里来的?
首先具体的异常类型是System.Configuration.ConfigurationErrorsException[1],在MSDN中的描述即是当配置出现错误时抛出。在Remark中的描述为“在读取配置信息或者写配置信息时抛出”,看来确实是配置文件出了问题。在上面的InnerException中,也可以看到明确的说明:“无法识别的配置节 configuration。 (\\bin\\Debug\\Com.***.vshost.exe.Config line 6) ”。那证明在运行此条代码时,读取配置文件出错了。
检查配置文件,确实也发现配置文件存在包含的Configuration节点。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <startup> 4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> 5 </startup> 6 <configuration> 7 <configSections> 8 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 9 </configSections> 10 <log4net name="Defaul
异常提示第六行存在错误,但实际上程序能正确启动,窗口能正确显示,日志系统也能正确工作。经过检查调试,App.config确实存在一些问题,比如还有configSections必须紧追<configuration>之后。修改后App.Config,全部工作正常。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Culture=neutral"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> </startup>
但是为什么App.config会影响到Ping函数的运行,并抛出此函数并不存在的异常呢?
查看了App.config 与 Ping的一些MSDN页面,暂时没有发现错误关联。还要继续追究。
参考:
[1]ConfigurationErrorsException, https://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(v=vs.110).aspx