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

  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. Session与Caching

    Session与Caching 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了A ...

  2. iOS开发分析"秘密"App内容页面的效果(两)

    @我前几天写的"秘密"的Cell制品的效果,想要的效果还是有差距,并且扩展性非常不好,于是重写封装,把总体视图都放到scrollView中,基本是和secret app 一模一样的 ...

  3. 解决tomcat占用8080端口

    怎么解决tomcat占用8080端口问题图文教程           怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Se ...

  4. SVN & Git (一)

    (一)SVN的使用.CornerStone图形化管理工具! SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...

  5. C# 实现设置系统环境变量设置

    原文:C# 实现设置系统环境变量设置 以前实现系统环境变量设置时是要在电脑属性--高级--环境变量设置,实现方式主要有2种, 修改注册表,添加环境变量 调用系统Kernel32.DLL函数,设置环境变 ...

  6. 多线程学习之五超时模式Timer

    timed[超时模式]案例:一个线程提供下载数据,另一个线程执行下载,如果有5秒钟以上,提供下载的线程没有提供数据,下载线程因超时异常,停止下载线程运行. 超时异常类 /** * */ package ...

  7. Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException

    1.错误描写叙述 信息: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10] ...

  8. 微软不也是从Altair Basic这丑小鸭长成白天鹅吗?

    微软不也是从Altair Basic这丑小鸭长成白天鹅吗? February 2015 如果你想要弄清楚初创企业是怎么一回事的话,其中一个非常有价值的尝试是去研究下那些获得巨大成功的公司,去分析下为什 ...

  9. JavaScript重载解读

    在JavaScript有一个特殊的数据类型---Function种类,JavaScript每个功能Function的类型,例如可以.由于函数是对象.指针,不会与某个函数绑定. <pre name ...

  10. effective C++ 札记 规定17 在单独的陈述newed对象插入智能指针

    // Test.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...