当前位置:首页 > 知道中心 > .NET > 文章

ASP.NET无法捕获的异常:MissingMethodException

发表于:2013-09-15| 次阅读| 作者:藕码网
TAG: ASP.NET
摘要:本文介绍在ASP.NET中,如果遇到了无法捕获的异常:MissingMethodException错误,该以什么思路去寻找解决办法。

本文介绍在ASP.NET中,如果遇到了无法捕获的异常:MissingMethodException错误,该以什么思路去寻找解决办法。

今天在解决一个项目问题时,遇到了问题。在系统日志里的“应用程序日志”,有一堆的异常:
异常信息:
   异常类型: 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能起作用了。


注:本站部分信息可能源于互联网分享,如有侵权,请告知,我们将及时删除!

推荐文章