【又长见识了】C#异常处理,try、catch、finally、throw
异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。处理这种错误,就叫做异常处理。
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的更多相关文章
- 长见识了,知道了collected和Graphite 这两个东东
今天下午的讨论会议中,听到了两个名词collected和Graphite这是神马东东,以前在bingo的时候也没听说过,开完会下去查了下.原来他两是监控系统的啊.以前也从来没做过系统监控方面的项目,这 ...
- 【又长见识了】函数传参,params参数,ref和out参数详解
一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...
- Java 异常处理 try catch finally throws throw 的使用和解读(一)
//最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...
- 异常处理-try catch
一:try catch是什么 try catch是java程序设计中处理异常的重要组成部分 异常是程序中的一些错误,有些异常需要做处理,有些则不需要捕获处理,异常是针对方法来说的,抛出.声明抛出.捕获 ...
- java异常处理try catch finally
1 异常 1.1 异常处理的作用 在编程时,如果出现文件打开失败,读写文件就会异常退出.如果出现内存溢出错误,程序也会异常退出.如果不能对这些异常进行处理.程序则无法正常运行.所 ...
- 异常处理 try...catch...finally 执行顺序, 以及对返回值得影响
异常处理 try...catch...finally 执行顺序, 以及对返回值得影响 结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,fina ...
- Apache DolphinScheduler 需要的sudo,还可以这么玩,长见识了!
Apache DolphinScheduler(incubator)需要的sudo,还可以这么玩,长见识了! 在新一代大数据任务调度 - Apache DolphinScheduler(以下简称dol ...
- JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...
- java:异常机制(try,catch,finally,throw,throws,自定义异常)
* String类中的格式化字符串的方法: * public static String format(String format, Object... args):使用指定的格式字符串和参数返回一个 ...
随机推荐
- 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
我们坐在地铁.经常拿出新浪手机查看新闻.腾讯新闻,或者看新闻,等刷微信功能.你有没有想过如何实现这些目标. 移动互联网.更活泼. 由于HTML5未来,jQuery Moblie未来. 今天我用jqm的 ...
- hdu Hat's Tea
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1288 去买茶,需要正好的钱才行,另外花的钱的个数最多 其实是一个简单的贪心问题,小的多取一点,多的少 ...
- How many prime numbers(素数)
Problem Description Give you a lot of positive integers, just to find out how many prime numbers t ...
- jquery扩展
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- Appium键盘操作
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66);方法2 HashMap<String, Integer> key ...
- ASP.Net MVC请求处理流程
ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...
- javascript7
语句:条件,循环,跳转, 表达式语句,复合语句和空语句,声明语句,var,function,条件语句,switch,循环,标签语句,break语句,continue语句,return语句,throw语 ...
- sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同
原文:sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同 说明: 以前要将一个表中的数据导出为脚本,只有用存储过程.现在在SQL Server ...
- hdu 4858 项目管理(STL集装箱)
项目管理 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- jQuery EasyUI API - Grid - DataGrid [原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...