无法捕获的异常: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能起作用了。
但是MethodNoTest类的另外一个方法aa,能正常调用和执行
整个问题处理完毕,教训就是,发布程序时,一定要确认本次发布的所有新dll,都全部拷贝到外网系统上
首发:http://beinet.cn
无法捕获的异常:MissingMethodException的更多相关文章
- 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...
- Java未被捕获的异常该怎么处理
在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式.class Exc0 { public static void ...
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...
- C# WINFORM 捕获全局异常
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Thr ...
- Javascript异步请求你能捕获到异常吗?
Javascript异步请求你能捕获到异常吗? 异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心.在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层 ...
- Android捕获崩溃异常
开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. ...
- 测试 __try, __finally, __except(被__finally捕获的异常, 还会被上一级的__except捕获。反之不行)
C语言标准是没有 try-catch语法 的, M$家自己提供了一组. /// @file ClassroomExamples.c /// @brief 验证C语言的非标准try, catch #in ...
- 在ASP.NET中使用SOAP Extensions捕获WebService异常
原文:在ASP.NET中使用SOAP Extensions捕获WebService异常 Application_Error不能捕获的异常 [WebMethod] public string Hello ...
- Android捕获全局异常
Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前 异常捕获处理后(将程序重新启动) 捕获异常的工具类 package ...
- SpringBoot捕获全局异常
1.创建GloableExceptionAop类捕获全局异常 package com.cppdy.exception; import org.springframework.web.bind.anno ...
随机推荐
- java三层模型与三层架构
http://zhidao.baidu.com/question/316273675.html?qbl=relate_question_4 持久层用来固化数据,如常说的DAO层,操作数据库将数据入库业 ...
- Caesar cipher
#include <iostream> using namespace std; int main() {int k,i; char s[5]; cin>>k; for(; ...
- DEDE函数
Html2text() 函数是去掉html标签代码. cn_substr(str,) 函数是截取字符串长度. 当然,他们也可以合并起来使用: [field:body function="cn ...
- HTML&CSS基础学习笔记1.24-input标签的单选与多选
单选和多选 单选框和多选框是用<input>标签来实现的. <input>标签的type属性值为"checkbox"时,表示多选框,为"radio ...
- VMware vSphere 6 Enterprise Plus License
Product: VMware vSphere 6 Enterprise Plus Licensed for 2 physical CPUs (unlimited cores per CPU) Lic ...
- Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)
在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...
- apache 启动不了
netstat -ano|findstr "443" 发现443端口被占 记录下443端口对应的PID 进入任务管理器,查看进程,发现为一个叫做vmware-hostd.exe的进 ...
- 黑马程序员_Java面向对象_包
7.包 7.1包(package) 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称是:包名.类名. 包也是一种封装形式. 利用命令行自动生成文件夹格式:D:\jav ...
- 快速理解RequireJs
原文地址:http://www.tuicool.com/articles/jam2Anv RequireJs已经流行很久了,我们在项目中也打算使用它.它提供了以下功能: 声明不同js文件之间的依赖 可 ...
- NetAnalyzer笔记 之 五 一些抓包技巧分享(不定期更新)
[创建时间:2016-03-12 10:00:00] [更新时间:2016-05-21 10:00:00] NetAnalyzer下载地址 前一段时间应为工作关系,NetAnalyzer笔记系列已经很 ...