异常的定义

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

常见异常的类型

  • 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. dotnet core开发体验之开始MVC

    开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...

  2. Python 学习笔记(3) - 控制流、函数

    控制流语句if.while.for.break.continue以上从最终作用效果来讲,同学过的其他语言没有什么不同.需要注意的只是语法,而Python 在语法上是如此让人赞叹和喜欢啊. 控制流语句的 ...

  3. UFLDL教程(六)之栈式自编码器

    第0步:初始化一些参数和常数   第1步:利用训练样本集训练第一个稀疏编码器   第2步:利用训练样本集训练第二个稀疏编码器   第3步:利用第二个稀疏编码器提取到的特征训练softmax回归模型   ...

  4. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  5. March of the Penguins

    poj3498:http://poj.org/problem?id=3498 题意:某个冰块上有a只企鹅,总共可以跳出去b只,问是否可能所有的企鹅都跳到某一块冰块上,输出所有的可能的冰块的编号. 由于 ...

  6. codeforces C. Jzzhu and Chocolate

    http://codeforces.com/contest/450/problem/C 题意:一个n×m的矩形,然后可以通过横着切竖着切,求切完k次之后最小矩形面积的最大值. 思路:设k1为横着切的次 ...

  7. 【UVALive - 5131】Chips Challenge(上下界循环费用流)

    Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...

  8. 关于sql语句in的使用注意规则( 转)

    select * from tuser where userno not in(select userno from filter_barcode) 上面这条语句子查询里,userno 并不存在fil ...

  9. 遍历、显示ftp下的文件夹和文件信息

    今天做了通过ftp读取ftp根目录下的所有文件夹和文件,嵌套文件夹查询,总共用到了一下代码: 1.FtpFile_Directory package com.hs.dts.web.ftp; impor ...

  10. dump iot表

    SQL> create user scan identified by scan default tablespace users; User created. SQL> grant db ...