今天一个同事发布站点,一直出现一些稀奇古怪的问题,各种各样的异常都有,根据这些异常去排查代码,都完全正常,很让人郁闷,因为代码里可能出异常的地方都记录了程序日志,所以他一直没去排查系统里的“应用程序日志”,只是在查程序,

后面找到我,我第一时间去看系统日志里的“应用程序日志”,果然有一堆的异常:
异常信息:
   异常类型: MissingMethodException
   异常消息: 找不到方法:“nameSp.abc.xxx()”。

然后就清楚了,这个xxx方法是nameSp.dll里新增的一个方法,再确认一下这个dll,果然是没发布最新dll,用的还是旧的dll,把nameSp.dll发布后,问题排除。

这时,同事还有一个问题,他说:我的代码是类似这样的:
try{
    nameSp.abc.xxx();
}catch(Exception exp){
    // 记录日志
}

为什么上面的代码没有记录日志呢?

我也晕了一下,后面写一个测试程序:
文件1:
class Program
{
    static void Main(string[] args)
    {
        try
        {
            new MethodNoTest().Run();
        }
        catch(Exception exp)
        {
            Console.WriteLine("外部出错:" + exp);
        }
    }
}

文件2:
public class MethodNoTest
{
    public void Run()
    {
        Console.WriteLine("开始");
        try
        {
            nameSp.abc.xxx();
        }
        catch (Exception exp)
        {
            Console.WriteLine("内部出错:" + exp);
        }
        Console.WriteLine("完成");
    }
    public void aa(){
        Console.WriteLine("abc");
    }

}

引用新dll编译成功后,再把旧dll拷贝到exe目录下,执行结果是:
外部出错:System.MissingMethodException:找不到方法:“void nameSp.abc.xxx()”

很奇怪吧,为什么连“开始”和“完成”都没有输出呢?

答案是编译完成的dll,只是il代码,并不是真正的机器码,.net程序在运行前还要把il代码编译转换为机器码执行,上面程序步骤:
1、Program类编译正常,执行到new MethodNoTest().Run();
2、发现MethodNoTest的Run方法未编译为机器码,开始编译,发现方法里引用的abc类没有定义xxx这个方法,就直接抛出异常,所以Run这个方法里的任何一句代码都没有执行,更不要说里面的try能起作用了。

但是MethodNoTest类的另外一个方法aa,能正常调用和执行

整个问题处理完毕,教训就是,发布程序时,一定要确认本次发布的所有新dll,都全部拷贝到外网系统上


首发:http://beinet.cn

无法捕获的异常:MissingMethodException的更多相关文章

  1. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

    毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...

  2. Java未被捕获的异常该怎么处理

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式.class Exc0 {    public static void ...

  3. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  4. C# WINFORM 捕获全局异常

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Thr ...

  5. Javascript异步请求你能捕获到异常吗?

    Javascript异步请求你能捕获到异常吗? 异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心.在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层 ...

  6. Android捕获崩溃异常

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. ...

  7. 测试 __try, __finally, __except(被__finally捕获的异常, 还会被上一级的__except捕获。反之不行)

    C语言标准是没有 try-catch语法 的, M$家自己提供了一组. /// @file ClassroomExamples.c /// @brief 验证C语言的非标准try, catch #in ...

  8. 在ASP.NET中使用SOAP Extensions捕获WebService异常

    原文:在ASP.NET中使用SOAP Extensions捕获WebService异常 Application_Error不能捕获的异常 [WebMethod] public string Hello ...

  9. Android捕获全局异常

    Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前 异常捕获处理后(将程序重新启动) 捕获异常的工具类 package ...

  10. SpringBoot捕获全局异常

    1.创建GloableExceptionAop类捕获全局异常 package com.cppdy.exception; import org.springframework.web.bind.anno ...

随机推荐

  1. css中“zoom:1”是什么意思

    继承性: 无 兼容性: IE 基本语法 zoom : normal | number 语法取值 normal : 默认值.使用对象的实际尺寸 number : 百分数 | 无符号浮点实数.浮点实数 ...

  2. Hadoop学习历程(三、第一个程序)

    根据之前的操作,我们已经可以正常的启动Hadoop了,关于真正的集群我会在之后进行说明.现在我们来看一下第一个程序吧 1. 在eclipse上建立一个java项目 2. 将 /usr/hadoop/s ...

  3. C语言基础学习基本数据类型-变量和常量

    变量和常量 什么是变量和常量?有些数据在程序运行前就预先设定,并在运行过程中不发生变化,称之为常量:有些数据在程序运行中可能发生变化或被赋值,称之为变量. 使用变量前必须先声明一个变量.变量定义的语法 ...

  4. 漫谈项目设计&重构&性能优化

    重构的好处:重构能够改进软件设计,随着项目需求的变更,项目体积的变大早已与最初的设计大相径庭,代码结构变得凌乱.复杂,如果不进行重构,则很难添加新的功能. 1.使项目代码更容易理解很多情况下是由于项目 ...

  5. Google Analytics:为链接点击设定事件追踪的方法

    在 Google Analytics 中,可以使用 Event Tracking 功能跟踪自定义的事件.但是,如果你要跟踪的是一个链接点击,那么单纯这样写则很有可能导致漏掉许多事件: <a hr ...

  6. 最近写的页面,含有大量的ajax

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><%@ taglib ur ...

  7. Unity中Mecanim工作流

    Mecanim工作流可以被分解为3个主要阶段:1.资源的准备和导入这一阶段由美术师或动画师通过第三方工具来完成,例如Max或Maya.2.角色的建立主要有以下两种方式1)人形角色的建立.Mecanim ...

  8. STARTUP.A51详解及如何使能可重入函数

    $NOMOD51       ;Ax51宏汇编器控制命令:禁止预定义的8051;------------------------------------------------------------ ...

  9. 2015第24周三Spring事务3

    在一个典型的事务处理场景中,有以下几个参与者: Resource Manager(RM) ResourceManager简称RM,它负责存储并管理系统数据资源的状态,比如数据库服务器,JMS消息服务器 ...

  10. poj3667---Hotel 线段树区间合并,区间更新

    题意:有N个房间,M次操作.有两种操作(1)"1 a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住.(2)"2 b len",把起点为b ...