异常的定义

异常就是程序中的运行时错误,当出现异常时,系统会捕获这个错误并抛出一个异常。若程序没有提供处理该异常的代码,系统会挂起这个程序。

常见异常的类型

  • System.Exception 最泛化的异常,其他所有异常类型都从它派生。
  • System.ArgumentException: 传给方法的一个参数无效。
  • System.ArgumenNullException: 一个不应该为null的参数为null。
  • System.ApplicationException: 一个自定义的应用程序异常,开发者可以用它标识特殊的非致命的应用程序错误。
  • System.FormatException:参数格式不符合调用的方法的参数规范。
  • System.IndexOutOfRangeException:试图访问一个不存在的数组元素。
  • System.NotImplementdeException:虽然找到了方法签名,但该方法尚未完全实现。
  • System.NullReferenceException:试图访问尚未包含任何数据的一个变量(一般是调用其值为null的一个对象的成员是引发)。
  • System.ArithemeticException: 发生了一个无效的数学运算,但其中不包括被零除。
  • System.StackOverFlowException:通常意味着一个无限循环,方法不停地回调自身(成为递归)。

异常处理过程

  • (1)BCL定义了许多类,每个类代表了一个指定的异常类型。当异常发生时,CLR首先创建给类型的异常对象,然后,寻找适当的catch子句处理异常。
  • (2)若异常在一个没有被try语句保护的代码中产生或若try语句没有匹配的catch子句,系统将按顺序搜索调用栈,寻找匹配的处理代码。

异常处理语句

try
{
//可能出现异常的代码!!
//在try块中的代码,如果一旦某句代码发生了异常,这从该条语句直接跳转到catch 块中,在try 块中该条语句后续的代码不会继续执行了。
}
catch
{
//当try块中的代码发生异常后,执行这里的代码
//如果try块中的代码没有发生异常,这不会执行catch 块中的代码
}
finally
{
//无论try块中的代码是否发生异常,都会执行这里的代码 ,比如资源释放,因为无论程序执行是否发生异常都需要释放资源。
}
static void T1()
{
try
{
Console.WriteLine("正常1");
//====引发异常代码=====
int n = 10, m = 0;
Console.WriteLine(n / m);
///====引发异常代码=====
Console.WriteLine("正常2");
return;
Console.WriteLine("正常3");
}
catch (Exception)
{
Console.WriteLine("溢出1");
//主动向上抛出异常时
throw;
}
finally
{
//虽然try块中有return语句,但是finally中的代码依然会执行,并且是在return 语句之前执行的。Console.WriteLine("最终1");
}
}

当异常代码注释时;

输出:正常1,正常2,最终1.

当异常代码取消注释时;

输出:正常1,溢出1,最终1.

其中有return,但这个对finally不管用,最终还是执行。

当发生异常后,就从异常代码直接跳转到catch语句中,异常代码后的代码不再执行,执行catch后,再执行finally语句。

程序可以使用 throw 关键字显式地引发异常。也可throw new argumentexception等手动抛出异常。

常见的问题

1、什么时候该异常处理?

1)代码最外层,如WinFrom,避免用户看到内部异常信息用户体验不好,或者造成程序崩溃,可以用log4net之类的框架记录异常。

2)遇到异常需要恢复状态或者重试的地方。例如连接数据库偶然失败了,可以有个重连机制,在Catch块重新连接数据库。

3)对于一系列有可能失败的任务,其中有一个任务失败,不想影响到其他任务。例如要上传100张图片,不想因为一张图片上传发生异常而失败,进而终止整个上传任务,仅需要记录下失败的图片,提醒用户重传即可。

2、异常处理需要注意的地方

1)Catch和Finally代码应该非常短,而且成功率极高,避免自己又抛出一个异常。否则CLR会终止进程,避免安全漏洞或者不可预知的后果。这个类似于Windows蓝屏,发生了严重的错误,宁愿使系统不可用。

2)Catch块尽量避免直接捕捉异常的基类Exception,而应该捕捉具体的异常类。

c#基础语言编程-异常处理的更多相关文章

  1. c#基础语言编程-程序集和反射

    程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...

  2. c#基础语言编程-正则表达式应用

    引言 在不同语言中虽正则表达式一样,但应用函数还是有所区别,在c#语言中使用Regex. 可以通过以下两种方式之一使用正则表达式引擎: 通过调用 Regex 类的静态方法. 方法参数包含输入字符串和正 ...

  3. c#基础语言编程-正则表达式基础

    引言 正则表达式是一种用高度抽象的字符串来描述字符串特征,进而实现对字符串的匹配.提取.替换等等.正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持, ...

  4. c#基础语言编程-文件流操作

    引言 在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件.目录.数据流的操作. 1.File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 2.File ...

  5. c#基础语言编程-编码

    字符编码是计算机技术的基础理论,其字符编码有ASCII码.UTF-8.还有就是GB2312,当然这是在中国常用的. 1.ASCII码 在计算机内部所有的信息都是以二进制字符进行存储.用每个二进制位中的 ...

  6. c#基础语言编程-Path和Directory

    引言 在程序常会对文件操作,在对文件操作中需要对文件路径的进行定位,在.Net中针对寻找文件提供两个静态类以供调用,Path和Directory. Path类 来自命名空间SYstem.IO,Path ...

  7. c#基础语言编程-装箱和拆箱

    引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...

  8. c#基础语言编程-多态

    语言中的多态性是为了使程序有扩展性,为实现多态性,在程序中体现为接口.抽象类.父类.具体类. 接口就是一种规范,解决了多重继承的问题,类似一种规范,告诉我要做什么,具有什么能力,在接口中定义写行为属性 ...

  9. c#基础语言编程-序列化

    引言 程序员在编写应用程序的时候往往要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为" ...

随机推荐

  1. 校省选赛第一场D题TwoDecks题解

    今天晚上第二场比赛,现在还是赛后刷上次的题目,越刷越伤心,发现我赛后一次AC的功力很强大啊!!!(希望今晚变成是赛中一次AC啊!!) 好啦,回归正题. 看题目 D. Merging Two Decks ...

  2. CentOS6.5 编译安装lnmp环境

    参考:http://54im.com/tag/libmcrypt http://www.educity.cn/linux/1240338.html 设置防火墙,并开启3306 80端口:vi /etc ...

  3. excel快递单号查询工具以及源码

    Function kdcx(kd, orderid) Dim Err, url, kdtime, link, Errcode, Status Select Case kd '此处支持的快递公司很多的 ...

  4. Newtonsoft.Json工具类

    这个类用于序列化和反序列化类. 效果是当前最好的.微软都推荐使用.在建立MVC的里面已经引用了这个dll. 上面一篇文章要用到 SerializeHelper工具类 public class Seri ...

  5. 链表与Hash检索实测

    测试环境: Win7 SP1.8G内存.3.4GHz 4核 测试代码: using System; using System.Collections.Generic; using System.Lin ...

  6. Entity Framework 实践系列 —— 搞好关系 - 单相思(单向一对一,one-to-one)【转】

    原以为躲入代码世界,就可以不用搞关系,哪知“关系无处不在”.写代码多年之后,终于明白“面向对象的关键是搞好对象之间的关系”.而Entity Framework作为ORM中的明日之星,首当其冲的使命就是 ...

  7. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  8. 【HDU2222】Keywords Search(AC自动机)

    Problem Description In the modern time, Search engine came into the life of everybody like Google, B ...

  9. python手记(31)

    #!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test2.jpg" ...

  10. C# 哈希表的实现

    8.4.2 Hashtable的代码实现   哈希表的实现较为复杂,为了简化代码,本例忽略了部分出错判断,在测试时请不要设key值为空.   1 using System; 2 public clas ...