zoukankan      html  css  js  c++  java
  • 异常的关联性

    .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

  • 相关阅读:
    Codeforces Round #313 (Div. 1) A.Gerald's Hexagon
    COJN 0585 800604鸡蛋的硬度
    COJN 0584 800603吃糖果
    COJN 0583 800602分苹果
    COJN 0575 800601滑雪
    昨天的补记
    重构的代码
    写了一个复杂的sql语句
    一个想法
    安装了C
  • 原文地址:https://www.cnblogs.com/jjseen/p/6197714.html
Copyright © 2011-2022 走看看