异常的关联性

.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() 位置 ***CommandsCommnadFunctionCollection.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

原文地址:https://www.cnblogs.com/jjseen/p/6197714.html