一、异常类

1、在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象;

2、在C#中,位于finally块中的代码可以保证不管代码是正常结束,还是进入异常处理代码块,其中的语句均会被执行。

System.Exception类有一些属性值得注意,这些属性被所有从此类派生的异常类共享,这些属性是:

  Message:一个只读字符串,此属性为当前的异常提供了描述性信息;

  InnerException:一个Exception类型的只读属性,如果它的值不为null,则可以通过它的值获取导致当前异常的异常实例;反之,如果其值为null,则表示当前异常不是由其他异常引发的。

  StackTrace:一个只读字符串,此属性描述了异常发生时调用堆栈的内容,其中首先显示最近的方法调用。

二、抛出异常

  当程序有错误的时候可以创建一个描述该错误的异常对象,然后用throw关键字抛出异常对象,抛出的异常对象将被当前代码的更上层代码所捕获,或者不处理直接抛出,或者干脆不予捕获。那么该异常将一直向上传递,直到有人捕获并处理它。

    class Program
{
static void Main(string[] args)
{
DoSomething(null); Console.ReadKey();
} public static void DoSomething(string name)
{
if (name == null)
{
throw new ArgumentException("参数不能为空!");
}
}
}

三、捕获异常

  可以使用try/catch来捕获并选择是否处理异常,捕获了异常并非一定要处理异常,还可以将异常转换为另一个异常后再抛出,或者仅仅是记录异常的信息。

  要记住,始终必须按照从最特定到最不特定(从具体到一般)的顺序对catch块中处理的异常进行排序,这个原则可以保证在将某个特定异常传递给更一般的异常的catch块之前处理该异常。

  try/catch块有三种形式:try-catch、try-finally、try-catch-finally,不带有catch或finally块的try语句将导致编译器错误。

  try语句中的代码是可能抛出异常的代码,catch块捕捉某种特定的异常并加以处理。这些catch块可以有多个,并且catch块可以串联在一起,如果存在多个catch块,那么计算顺序是从顶部到底部。但是对于所引发的每个异常,都只执行一个catch块。

  1、好的编程的做法是捕获特定类型的异常,而不是捕获更常规的异常。

  2、如果捕获特定类型的catch块捕获异常的基类型catch块同时存在,则前者要位于后者之前,否则将无法通过编译。

    class Program
{
static void Main(string[] args)
{
DoSomething(null); Console.ReadKey();
} public static void DoSomething(string name)
{ try
{
Console.WriteLine(name);
if (name == null)
{
throw new ArgumentException("参数不能为空!");
}
}
catch (ArgumentException ex)
{
name = "你好";
DoSomething(name);
Console.WriteLine(ex.Message); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{ }
}
}

四、自定义的异常类

  要创建用户自定义异常类,需要遵循以下几点

  1、从System.ApplicationException或者System.Exception类派生。

  2、使用"Exception"这个词作为自定义的异常名称的后缀。

  3、至少提供三个公共函数。

  4、一个不包含参数的默认构造函数。

  5、一个可以包含异常消息的构造函数,只有一个参数:message。

  6、一个可以包含异常消息,以及引发该异常的异常引用的构造函数,这两个参数分别是message和innerException。

    public class OneException : System.ApplicationException
{
public OneException() { }
public OneException(string message) : base(message){}
public OneException(string message,System.Exception innerException) : base(message,innerException){}
}

五、异常处理原则

  1、尽量由程序自动处理异常。当异常发生时,程序在捕获后应该先尝试处理异常,如果错误得以排序,那么程序可以恢复正常,而不是每次捕获异常就立刻通知用户来处理,或者仅仅把异常信息记录下来。例如网络传送发生连接错误,应该先重连几次,然后再通知用户处理。

  2、限制异常范围,应该尽量地减少缩小异常处理的范围,如果只需要检测某一行代码可能发生异常,就不要把整段的代码都放进try语句块中。

  3、应该捕获更具体的异常。尽量避免直接捕获Exception异常。

  4、尽可能在上层捕获并处理异常。

  5、应该将异常信息保存在日志中。

突然回忆起上次面试的一段代码:

    class Program
{
static void Main(string[] args)
{
string name = GetName();
Console.WriteLine(name);  //输出 就算return了这行也会执行哦!
                       //输出 你好
Console.ReadKey();
} public static string GetName()
{
try
{
return "你好";
}
catch (Exception ex)
{
return "捕捉到异常!";
}
finally
{
Console.WriteLine("就算return了这行也会执行哦!");
}
}
}

  留意到,几时是没抛出异常同时return了也执行了finally里面的代码。

C# Exception类的更多相关文章

  1. Java基础(55):Exception类详解(转)

    Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...

  2. C++学习41 exception类

    C++语言本身或者标准库抛出的异常都是 exception 的子类,称为标准异常(Standard Exception).你可以通过下面的语句来匹配所有标准异常: try{ //可能抛出异常的语句 } ...

  3. 每天一点点java---继承exception类来实现自己的异常类

    package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类 ...

  4. Exception类的学习与继承总结

    日期:2018.11.11 星期日 博客期:023 Exception类的学习与继承总结 说起来我们上课还是说过的!老师提到了报错问题出现主要分Exception和Error两类!第一次遇见这个问题是 ...

  5. Java -- 异常的捕获及处理 -- Exception类与RuntimeException类

    7.3 Exception类与RuntimeException类 Exception类与RuntimeException类的联系与区别??? 例:字符串变为整型 Class : RuntimeExce ...

  6. Java异常 Exception类及其子类

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  7. muduo网络库源码学习————Exception类

    Exception类是为异常捕获而设计,可以获得异常的信息以及栈的回溯信息 (原来的代码没有demangle成员函数,输出的格式比较难看,加了demangle成员函数,利用demangle成员函数可以 ...

  8. 用Exception类捕获所有异常的技术是怎么用的?

    3.用Exception类捕获所有异常  马克-to-win:注意,一个事实是:Exception类是所有其他异常类的父类,所以Exception类能捕获所有的异常.马克-to-win:问题是用Exc ...

  9. thinkphp5 Exception类重定义

    重点定义自己的错误信息和错误码: 在TP5的配置文件中有下面一段 // 异常处理handle类 留空使用 \think\exception\Handle 'exception_handle' => ...

随机推荐

  1. 膜拜一个神奇的女人——Hedy Lamarr

    她演绎了首部露点电影.经历了六次婚姻.出版了首本自曝隐私的自传,还曾入室行窃过两次——在这样一个饱受争议的大环境下,她还能在60多年前提出“跳频”技术和一系列无线信号技术的全新概念,其中,“跳频”技术 ...

  2. Win8.1专业版、核心板和企业版有什么区别

    Win8.1核心版(一般就称之为Windows 8.1) + Win8.1 专业版(称之为Windows 8.1 Pro),根据用户输入的序列号(就是Win8密钥)来区分安装.Win8.1企业版(称之 ...

  3. codility上的问题 (22)

    问题描述: 用1 * 1, 1 * 2的矩形覆盖一个n行m列的矩形,问有多少种方法. 数据范围 : n [1..10^6],  m [ 1..7] 要求复杂度: 时间  O(log(n) * 8 ^m ...

  4. 使用 Strace 和 GDB 调试工具的乐趣

    编写 UNIX® 系统程序充满乐趣,并且具有教育意义.使用 UNIX strace 工具和 GDB(GNU 项目调试工具),您可以真正地深入研究系统的功能,并了解组成这些功能的各种各样的程序.同时使用 ...

  5. webapp设计注意事项

    色彩设计 美学相关的知识(色彩构成.平面构成等等)我就不再赘述了,相信从事此类行业的人员无人不知无人不晓了.这里简要说说WebApp设计中,色彩以及构图的特别之处吧. 首先是色彩.从事过广告和印刷业设 ...

  6. Android面试题07

    62. 说说mvc模式的原理,它在android中的运用. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.Controller的方 ...

  7. Animation Override Controller动画重载器

    假设游戏有很多个小人, 每一个人有2种动画站立,跑.  在通常情况下每一个人物都需要一个动画控制器. 有没有想过定义一个动画控制器 无须在定义全新的动画充值器实现每一个小人都播放自己的动画呢?没错An ...

  8. qt绘制设备

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from Py ...

  9. Hug the princess(思维,位运算)

    Hug the princess Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

  10. Java中遍历Map对象的方法

    方法一: 在for-each循环中使用entries来遍历 这是最常见的遍历方式,在需要获取key和value时使用. Map<Integer, Integer> map = new Ha ...