C#异常处理总结

  1. Exception类分析
  2. 常见的异常类
  3. 异常捕获
  4. 异常处理原则和建议

SystemException类继承Exception,前者是System命名空间中所有其他异常类的基类,在捕获异常的时候,我首先查看的就是Exception对象信息。Exception重要成员如下图 
这里写图片描述 
1.Message属性:产生异常原因的错误消息

[__DynamicallyInvokable]
public virtual string Message
{
    [__DynamicallyInvokable]
    get
    {
        if (this._message != null)
        {
            return this._message;
        }
        if (this._className == null)
        {
            this._className = this.GetClassName();
        }
        return Environment.GetRuntimeResourceString("Exception_WasThrown", new object[] { this._className });
    }
}

Message属性是只读属性,GetRuntimeResourceString是获取运行时资源字符串。返回的字符串是产生异常原因的错误消息或者空字符串。

2.Data:的其他异常信息的键/值对的集合

public virtual IDictionary Data {
            get{
                if (_data == null)
                  if(IsImmutableAgileException(this))                             _data = new EmptyReadOnlyDictionaryInternal();
                  else
                     _data = new ListDictionaryInternal();
                return _data;
               }
        }

3.StackTrace:出现异常之前调用的方法名称和签名

public static string StackTrace
{
    [SecuritySafeCritical]
    get
    {
        new EnvironmentPermission(PermissionState.Unrestricted).Demand();
        return GetStackTrace(null, true);
    }
}

4.Source属性:包含生成异常的应用程序或对象的名称 
5.TargetSite属性:引发当前异常的方法 
6.GetBaseException方法 :返回System.Exception,它是所有异常类的“基”类。

常见的异常类

异常类型有很多,他们都是继承自SystemException,这些异常类型大概分为以下这几种1.与数组集合有关2.与成员访问有关3.与参数有关4.与算术相关5.IO相关6.当然还有其他的一些异常。 
1.与数组集合有关 
IndexOutOfRangeException类:索引超出范围引发的异常 
ArrayTypeMismatchException类:数组集合存储数据类型不正确引发的异常 
RankException类:处理维数错误引发的异常 
2.IO有关的异常 
与IO相关的异常都继承自IOException类,该类用于处理进行文件输入输出操作时所引发的异常,IOException类的5个直接派生类如下。 
DirectoryNotFoundException类:没有找到指定的目录而引发的异常。 
FileNotFoundException类:没有找到文件而引发的异常。 
EndOfStreamException类:处理已经到达流的末尾而还要继续读数据而引发的异常。 
FileLoadException类:无法加载文件而引发的异常。 
PathTooLongException类:文件名太长而引发的异常。 
3.成员访问有关的异常 
与成员访问相关的异常都继承自MemberAccessException这个类,它继承自SystemException。 
FileAccessException:访问字段成员失败所引发的异常 
MethodAccessException:访问方法成员失败引发异常 
MissingMemberException:成员不存在引发的异常 
4.参数相关的异常 
与参数有关的异常类ArgumentException都继承自SystemException,处理给方法成员传递参数时发生异常 
ArgumentOutOfRangeException:当一个参数不在给定范围内引发的异常 
ArgumentNullException:参数为null(不允许null)的情况下引发的异常 
5..与算术相关 
ArithmeticException异常类用于处理与算术相关的异常,它的相关子类如下 
DivideByZeroException:整数十进制试图除以0引发的异常(被除数不能为0) 
NotFiniteNumberException:浮点数运算中出现无穷大或非负值引发的异常 
6.其他异常 
NullReferenceException:当一个对象没有实例化时并引用引发的异常 
InvalidOperationException:当对方法的调用对象当前状态无效时引发异常 
InvalidCastException:处理类型转换期间引发的异常 
OutOfMemoryException:处理内存不足引发的异常 
StackOverflowException:处理栈溢出引发的错误

异常捕获

c#中提供try 和catch块提供了一种结构化的异常处理方案,所有可能出现的异常都必须得到妥善的处理,try catch本身并不会影响系统的性能,在没有发生异常的时候try catch 是不会影响系统性能的。受影响的时候是发生异常的时候。 
关键字 try catch finally。先执行try里面的语句,如果抛出异常就会被catch捕获。无论出不出现异常都会执行finally里面的语句。另外不常用的throw关键字:当问题出现时,程序抛出一个异常。

class Program
    {
        static void Main(string[] args)
        {
            DivideNumber div = new DivideNumber();
            div.DivideMethod(2, 0);
            Console.ReadKey();
        }
    }
    class DivideNumber
    {
        int result;
        public DivideNumber()
        {
            result = 0;
        }
        public void DivideMethod(int a,int b)
        {
            try
            {
                result = a / b;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("exception,被除数不能为0,e.message:" + e.Message);
            }
            finally {
                Console.WriteLine($"{a}除以{b}的结果是"+result);
            }
        }
    }

异常处理原则和建议

在实际的开发中,异常到底需要怎么写,还是和系统的稳定性和容错性有一定要求的。

要捕获具体的异常 
在捕获异常的时候,我们经常习惯性写catch(Exception ex) ,这个并非具体的异常,最好是能具体到ArgumentException、FormatException等异常类,不要抛出”new Exception()” 
catch中啥也不干,异常要向顶层抛出 
这种情况在自己写demo的时候可能比较常见,在编写catch(Exception ex)这块代码下啥也不干,不要这样做。切记出现的异常要想顶层抛出 
合理使用finally块 
finally关键字是不管抛出什么类型异常都会被执行,大多数的时候能在finally块下执行的代码,也能写在catch里面。那么finally关键字到底在什么情况下使用比较合适呢,比如清理资源,关闭流,回复状态等。 
抛出的异常要记录下来 
当然程序中出现的异常并不是所有都要记录下来,有些异常还是记录下来便于分析具体的问题。一些记录日志库 log4net ,EIF…… 
不要只记录Exception.Message的值,还需要记录Exception.ToString() 
刚刚前面的例子,我打印的e.Message ,仅仅只是输出“尝试除以0”,提示的错误信息不具体,并不推荐这样做。Tostring方法中包含了stacktrace、内部异常信息、Message…..通常这些信息比仅一个Message更重要 
不要将“抛出异常”作为函数执行结果的一种 
“抛出异常”应该向顶层抛出,但是不能作为方法执行结果的一种,方法的结果不能是异常类。 
每个线程要包含一个try/catch块 
创建子线程去执行任务时,主线程不会知道子线程的异常情况,所以每个线程都需要一个try、catch. 
来自“代码思考者“的评论 
之前在做C#项目的项目经理时,我也思考过如何有效地在项目团队中实践异常的处理。 
首先,异常处理应该是系统设计规约的一部分出现在系统设计文档中,而不仅仅是一种技术实现。 
作为设计文档的一部分,异常处理应该着眼于系统容错性和稳定性(正如楼主提到的那样)。然后在根据这个规约,再来具体讨论和选择异常处理中使用的各种技术细则。 
比如,在设计服务时,必须在服务的调用接口处有异常处理,否则客户端传过来的任何有害数据都可能让服务器挂掉。 
比如,对异常的处理在系统的设计中,必须有明确说明,不能随便在哪个模块中处理异常。 
以上是我的个人经验,还望走过的朋友多多交流。

作者:张林 标题:C#异常处理总结 
原文地址:http://blog.csdn.net/kebi007/article/details/78221083 转载随意注明出处

原文地址:https://www.cnblogs.com/dearzhoubi/p/8794272.html

时间: 2024-10-09 21:04:09

C#异常处理总结的相关文章

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

跟着百度学PHP[11]-PHP当中的异常处理

首先要说一下常见的三种错误: 1.语法错误 2.运行错误 3.逻辑错误 00x1 错误报告及错误级别 PHP的错误分为三个等级 1.注意(notice)   没有变量a 2.警告(warning) 没有给函数传值 3.致命的错误(fatal error) 函数写错 错误的报告级别可以在PHP.ini当中修改.在PHP.ini当中找到错误报告“error_reporting = E_ALL ” 这个的意思是将所有的错误都提示出来.ps:~是除了的意思.&是和的意思.error_reporting

JAVASE02-Unit08: 文本数据IO操作 、 异常处理

Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; /** * java.io.Ob

python3_装饰器_异常处理

装饰器: def auth(func):     def wrapper(name):                     如果函数带参数,要加在这里         user=raw_input("input passwd:").strip()         if user=='test':             print "welcome login"             func(name)              如果函数带参数,要加在这里

动手动脑(异常处理)

1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutException { public static void main(String[] args) { float i=1, j=0, k; k=i/j; System.out.println(k); try { k = i/j;    // Causes division-by-zero exceptio

异常处理

我们在使用Java语言高级API进行程序设计之前,我们还需要理解Java语言中另一个基础特色-----异常处理 异常(Exception)是程序在执行过程中所产生的问题.导致异常产生的原因有很多种: 用户输入了无效的数据.找不到一个需要打开的文件.在通讯过程中网络连接断开或者JVM发生了内存溢出 异常的分类: 检查异常-----是用户错误或不能被程序所遇见的问题 运行时异常-----是一个程序在运行过程可能发生的问题 错误-------实际上,错误根本不是异常,但却是用户或程序所无法控制的问题

Java异常处理

异常的层次结构 所有的异常类都是 java.lang.Exception 类的子类型.异常类都是 Throwable 类的子类.除了异常类 Error 类也是由 Throwable 类产生的的子类1. public String getMessage() 返回关于发生异常的细节信息,这些信息在Throwable的构造函数中被初始化2. public Throwable getCause() 返回发生异常的原因,由 Throwable 对象来表示3. public String toString(

SpringMVC 异常处理

一.异常解析器应该具有的功能: 1.既然使用异常解析器,那么就不必在Controller中对异常进行处理,抛出即可,简化开发,异常统一控制. 2.ajax请求(有@ResponseBody的Controller)发生错误,输出JSON. 3.页面请求(无@ResponseBody的Controller)发生错误,输出错误页面. 4. 它需要与AnnotationMethodHandlerAdapter使用同一个messageConverters 5.异常处理细节可控制. 二.SpringMVC异

16.如何自学Struts2之Struts2异常处理[视频]

16.如何自学Struts2之Struts2异常处理[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95 有问题可以直接回复这篇文章.

详解Linux内核异常处理体系结构

本节内容:Linux内核异常处理的的初始化过程和异常发生时的处理流程. [首先来区分一下两个概念:中断(Interrupt)和异常(Exception).中断属于异常的一种,就拿2440开发板来说,他有60多种中断源,例如来自DMA控制器.UART.IIC和外部中断等.2440有一个专门的中断控制器来处理这些中断,中断控制器在接收到这些中断信号之后就需要ARM920T进入IRQ或FIQ模式进行处理,这两种模式也是中断异常的仅有模式.而异常的概念要广的多,它包括复位.未定义指令.软中断.IRQ等等