异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。处理这种错误,就叫做异常处理。

  1、轻描淡写Try、Catch、Finally、throw用法

  在异常处理中,首先需要对可能发生异常的语句进行异常捕捉,try就是用于预测可能出现的异常。捕获异常并对异常进行处理,就在catch中实现。不管异常发生与否,都会执行finally里面的语句。先看一个例子:  

        static void Main(string[] args)
{
Console.WriteLine("请输入除数:");
int num1 =int.Parse ( Console.ReadLine());
Console.WriteLine("请输入被除数:");
int num2 = int.Parse(Console .ReadLine ());
int res = ;
try
{
Console.WriteLine("异常前…………………………");
res = num1 / num2;
Console.WriteLine("无异常…………………………");
Console.WriteLine("{0}除以{1}等于:{2}", num1, num2, res);
}
catch (Exception ex)
{
Console.WriteLine("出现异常了!!!!!!!!");
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine();
Console.WriteLine("计算结束!");
} Console.Read(); }

  如上例所示,两个数相除,特别是用户输入的时候不可控,很可能存在除数为零的异常,把它们放在try语句中。当执行到try语句中,出现异常立即退出try语句(意味着出现了异常,异常以前的语句要执行,异常后的语句就不执行了),然后执行catch中的语句。不管异常出现与否,都要执行finally里的语句。其实最后一句不放在finally里面,还是不管异常发生与否都会执行啊,那finally有什么作用呢?先埋一个伏笔。throw则用于抛出异常,把异常返回给程序,出了异常,当然程序就会中断啦,会抛出异常。

 

  再看一个例子:try和catch中存在retrun的情况

        static int Division(int num1, int num2, out int res)
{
int times = ;
try
{
res = num1 / num2;
return times;
}
catch (Exception ex)
{

res = 0;
                  return times--;

            }
finally
{
times++;
} }
            int res;
// int times = Division(20, 0, out res);
int times = Division(, , out res);
Console.WriteLine(res);//输出结果为2
Console.WriteLine(times);//times????

  因为不管发生异常与否都会执行finally里面的语句,那times应该是1。但结果两种情况下都是0。这是什么原因,这是因为在try中return了。用反编译的方式,我们可以看到,其实在try或者catch中return,相当于在声明了一个变量,把要return的值赋给变量,最后再在finally之后(其实是整个函数运行到最后)才返回这个变量,所以原来return回去的值是没有改变的。即使不写把times++写在finally之中,就写在后面,返回结果还是一样的。   (所以上面这个函数就不能这么写拉,我是故意错的哟,嘻嘻哈哈!!!)

  finnally中还是执行了times++的。

  但如果是引用类型的话,由于传递的是地址,把地址赋给一个变量最后返回地址,返回的结果就看这个地址指向的内容的变化了。既然有缘看到这篇文章,自己试一下吧!(嘿嘿)

  又有一个疑问了,那finally有啥用???

  2、自定义异常

  一个try可以捕获多个异常,try和catch中都能再嵌套try和catch,如下:

          try
{
try
{ }
catch (Exception)
{ throw;
} }
catch (DivideByZeroException de)
{
try
{ }
catch (Exception)
{ throw;
} }
catch (OverflowException oe)
{ }
catch (Exception ex)
{ }
finally
{ }

Try_Catch_Finally

这些异常都继承自Exception,所以也可以自定义异常。定义一个类继承自Exception就行了。如下:

 class MyException:Exception
{
public MyException():base()
{ }
public MyException(string msg):base( msg)
{
msg = "自定义异常";
}
}

自定义异常

          try
{
throw new MyException();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message );//输出引发类型为“Try_Catch_Finally.MyEexception”的异常 }

  一个try中可以有多个catch,但是只能有一个finally;try至少要有catch或者finally,不能单独try;try ,catch,finally中可以均嵌套try_catch_finally;

  Finally:

  Finally,主要用于异常安全,当try中没有catch的时候,只能在finally中释放上一级资源。

  using 的用法,就是最后自动dispose,它内部的原理就是利用了try-finally,在finally中dispose;

Using:

  顺便说一下using的用法,使用using可以在using作用域结束后自动释放资源(dispose),要使用using,类必须继承了Idispose方法才行。

  暂时先总结于此,边学边用再边补充  .. 。。o o 0

  

  

【又长见识了】C#异常处理,try、catch、finally、throw的更多相关文章

  1. 长见识了,知道了collected和Graphite 这两个东东

    今天下午的讨论会议中,听到了两个名词collected和Graphite这是神马东东,以前在bingo的时候也没听说过,开完会下去查了下.原来他两是监控系统的啊.以前也从来没做过系统监控方面的项目,这 ...

  2. 【又长见识了】函数传参,params参数,ref和out参数详解

    一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...

  3. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    //最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...

  4. 异常处理-try catch

    一:try catch是什么 try catch是java程序设计中处理异常的重要组成部分 异常是程序中的一些错误,有些异常需要做处理,有些则不需要捕获处理,异常是针对方法来说的,抛出.声明抛出.捕获 ...

  5. java异常处理try catch finally

    1       异常 1.1      异常处理的作用 在编程时,如果出现文件打开失败,读写文件就会异常退出.如果出现内存溢出错误,程序也会异常退出.如果不能对这些异常进行处理.程序则无法正常运行.所 ...

  6. 异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

    异常处理 try...catch...finally 执行顺序, 以及对返回值得影响 结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,fina ...

  7. Apache DolphinScheduler 需要的sudo,还可以这么玩,长见识了!

    Apache DolphinScheduler(incubator)需要的sudo,还可以这么玩,长见识了! 在新一代大数据任务调度 - Apache DolphinScheduler(以下简称dol ...

  8. JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

    JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...

  9. java:异常机制(try,catch,finally,throw,throws,自定义异常)

    * String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...

随机推荐

  1. Android开源--MenuDrawer

    开放的源地址:https://github.com/SimonVT/android-menudrawer 简单介绍:menudrawer是跟sliderMenu差点儿相同的一种框架,常被应用做设置界面 ...

  2. oracle_job 清空冗余数据 ,每一分钟执行一次

    参照这个例子:http://cherryqq.iteye.com/blog/855022 思路: data表中有4条数据 ,relation有3条数据,通过data_id 对应,需要定时删除 data ...

  3. ORA-00911:无效字符错误

    ORA-00911:无效字符错误--造成构建环境的一个小错误 实施某功能脚本语句.编译时,出现了ORA-00911错误,当时有些疑惑,之前生产库使用是没有问题的,经过一番检查后发现原来是一个非常细微的 ...

  4. Robot Framework + appium 启动手机浏览器的两个方法(1)

    一.Open Browser启动 使用Selenium2Library的Open Browser方法,例子如下: browser=手机浏览器类型,如chrome 二.Open Application启 ...

  5. 如何完成Nexus 9上电后激活过程

    所述被激活,因为它是Nexus 9经过努力获得启动OTA最新更新包,而且因为Google关闭一堵墙.原因无法下载更新包. 因为是第一次开机,它不能被设置usb debugging, 无法adb去杀死w ...

  6. 高性能双端js模板---simplite

    simplite是一款js实现的模板引擎,它能够完成浏览器端js模版和node服务器端js模板的数据渲染,渲染性能达到引擎的极限. 渲染性能十分突出. 支持浏览器端和node服务器端模板渲染. 它简单 ...

  7. 【solr这四个主题】在Tomcat 部署Solr4.x

    1.安装Tomcat (1)下载并解压缩到/opt/tomcat在 # cd /opt/jediael # tar -zxvf apache-tomcat-7.0.54.tar.gz # mv apa ...

  8. 去除a标签链接触摸时产生边框

    排除误解 网络资料说这个属性只用于iOS(iPhone和iPad),其实是错误的,android手机大部分也是支持的,只是显示效果不一样,移动开发并不成熟,更多的还需要大家去实践来辨别真伪- - -w ...

  9. Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列

    Atitit.升级软件的稳定性---基于数据库实现持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...

  10. Java泛型和集合之泛型VS模板

    Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号  是因为他 ...