异常与委托反射(一)

   当我们运行的结果和预期不一致的情况下,就会导致异常,我们常常会认为异常是系统带给我们的,其实不是,异常是写代码类库的人会认为我们写的这段代码有可能会出现错误,就会给我们抛出异常,让我们去注意然后去解决。

什么是异常?

  1. 运行时出现错误或BUG
  2. 编写代码预期条件和实际条件不吻合
  3. 异常机制是为了保证程序一直正常运行

在c#中的异常处理

先预热举一个小例:

在c#中,假如我们程序运行到了 Convert.ToInt32("123")→1*100+2*10+3,当如果是Convert.ToInt32("abc")就会出现错误,因为无法将字符类型转换成Int类型。

因为系统类库在程序员在封装这个方法时,有可能是以这么一种形式进行编写:

当我们在这个环境下就行运行程序,系统就会抛出异常

-> 如果异常不处理程序就会死掉

 1 public void Func1()
 2 {
 3 Func2();
 4 }
 5
 6 try
 7 {
 8 // 可能出现异常的代码
 9 // 出现异常,其后的代码不再执行
10 // 直接跳转到catch
11 }
12 catch(Exception ex)
13 {
14 // 写入日志,处理异常后的首尾工作
15 }

如果在程序中异常如果没有得到处理,就会继续往上提交直至异常被处理,如果最终没被处理,系统就会报错。

在Java中的异常处理

  1. throws用在方法声明中,表明当前方法在运行时会有异常抛出,需要在调用该方法的时候注意控制异常。
  2. throw用在方法体内,手动制造一个异常,中断代码的继续执行。
  3. try-catch-finally是一起使用的。

    当某段代码在运行期间可能会发生异常而终止执行时,使用。

    结构为:

    try

    {

    //可能发生异常的代码

    }

    catch (异常类型 )

    {

    //异常发生时的处理方式

    }

    finally

    {

    //其他必须执行的语句

    }

    当try语句块中的代码在执行时发生异常,就会被catch捕获,进入catch语句块进行处理,如果没有发生异常就继续执行,finally语句块中的代码是一些必须执行的语句,这里的代码无论try中是否发生异常都会被执行。

在C语言,汇编语言中的异常处理

所有东西都是通过返回值来进行的,没有异常的概念,而是通过返回int类型的整数来确定程序是否出现了问题。

举一个简单例子:

在c语言中嵌入了汇编程序来处理程序触发的windows异常处理.程序中加了注释,问题就在里面:

__asm{

/*假设程序运行到此处,几个寄存器值分别为:eax=1,ebx=2;ecx=3;edx=4,edi=1000,esi=1100,ebp=1024,esp=1300*/

push offset Error;

push fs:[0];

mov fs:[0],esp;

mov [eax],ebx;

/*程序在这里触发异常*/  Error:/*解发异常后陷阱处理程序会运行到此*/

lea eax,[esp+0xc];

mov eax,[eax];

add eax,184;

mov [eax],

0ffset RUN_001; xor eax,eax;

/*设置运行RUN_001*/  ret;  RUN_001:

/*程序运行到这里,则:各各寄存器的值是否是:eax=1?,ebx=2?,ecx=3?,edx=4?,edi=1000?,esi=1100?,ebp=1024?,esp这个值肯定是1308无疑问!

就是当我们拦截到自己程序异常后,各各寄存器值是否恢复?这个不一定,主要还是看你的异常处理例程是怎么处理的。对于可修复错误,或许事可以从断点处继续执行。这时候程序上下文被保存,用于返回现场。但是对于致命错误,程序直接退出。各寄存器的值都是不可预知的。

时间: 2024-10-08 06:22:06

异常与委托反射(一)的相关文章

C#在工作线程刷新主界面控件状态小结,单例模式、委托

今日项目开发中需要在服务器界面实时显示客户端连接状态,使用C#的反射机制解决了问题.由于项目比较复杂,现结合一个小例子,对使用C#委托反射机制刷新主界面上的控件状态进行简单小结,希望对新手有所帮助. 一.新建一个C# winform工程:Form_MainUI,界面布局如图1. 代码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data;

委托,不知道你是否有也这样理解(二)

目录 泛型委托 简化语法 委托与反射 相关文章链接: 事件,你是否也这样理解  http://www.cnblogs.com/sunchong/p/sunchong.html 委托,你是否也这样理解(一) http://www.cnblogs.com/sunchong/p/3480612.html 一.泛型委托 我们知道泛型能够提高效率,避免代码重复,灵活. C#提供了无返回值的泛型委托:Action public delegate void Action<in T>(T obj); 从上我们

Java千百问_04异常处理(007)_常见的java异常有哪些(非运行时)

点击进入_更多_Java千百问 1.常见的java运行时异常有哪些 了解非运行时异常看这里:什么是java中的异常 常见的运行时异常看这里:常见的运行时异常有哪些 我们所说的常见异常是jdk或者其他常用第三方jar中的异常,出现频次很高的异常.常见的非运行时异常(即检查异常,checked exception)包括: 操作数据库异常:SQLException 输入输出异常:IOException 文件未找到异常:FileNotFoundException 反射操作异常:ReflectiveOpe

java开发--反射技术

学习目标: 1.什么是反射:即反射的定义, 2.反射有什么作用,能解决什么问题, 3.反射的知识点是什么, 4.反射的利弊 5.反射的例子 1.什么是反射:反射的定义: a) 能够分析类能力的程序被称为反射(reflective) 2.反射的作用,能解决什么问题: 1.在运行中分析类的能力 2.在运行中查看对象 3.实现数组的操作代码 4.利用Method对象,这个对象很像c++中的函数指针 使用反射的主要人员是工具构造者,而不是应用程序员. 反射机制最重要的内容:检查类的结构. 3.反射的知识

C# 委托基础

不知不觉,又开始委托的学习了,感觉这个东西我能学一辈子,哈哈哈!这次看的是官方的参考书(C#高编9),每次看不同的资料,总能学到不同的知识!言归正传 1.为什么要使用委托? 我们习惯于将数据作为参数传递给方法,但是很多时候我们需要将一个方法传递给另一个方法.所以委托就是干这个的,将方法作为参数,传递给另一方法. 举个例子:在C#中,可以告诉计算机并行执行某些新的执行序列,同时运行当前任务,这个序列就称之为线程,如果要告诉计算机启动一个新的线程,就必须告诉线程入口方法在哪里,并告诉计算机开始启动方

反射获取一个类的私有方法

今天在刷面试题的时候,发现一个题目是编写程序通过反射获取一个类的私有方法,因为之前学反射的时候也学的浅,没有考虑到这样的事情.今天敲了一下,虽然也就是那么几行代码,还是磕磕绊绊的,最后终于搞定了,这里总结一下 Java反射得到一个类的私有方法 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method method=clazz.getMeth

常见的几种异常类型 Exception

常见异常类型:Java中的异常分为两大类: 1.Checked Exception(非Runtime Exception) 2.Unchecked Exception(Runtime Exception) 算数异常类:ArithmeticExecption 空指针异常类型:NullPointerException 类型强制转换类型:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsExc

错误/异常:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 的解决方法

1.错误/异常视图 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseDao' defined in class path resource [spring/beans_common.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInsta

NCoreCoder.Aop 国庆更新

原本的IAopActors如下 public interface IAopActors { object Execute(AopContext context); Task<TResult> ExecuteAsync<TResult>(AopContext context); Task InvokeAsync(AopContext context); } 非代理部分是用的AspectCore.Extensions.Reflection优化的反射 个人感觉代码不够优雅,遂改为 pub