【读书笔记】C#高级编程 第十六章 错误和异常

(一)简介

错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为应用程序的最终用户引发或运行代码的环境而发生错误。C#提供了异常处理机制来处理错误。

(二)异常类

在C#中,但刚出现某个特殊的异常错误条件时,就会创建(或抛出)一个异常对象。一般情况下异常没有特定的名称空间,异常类应放在生成异常的类所在的名称空间。

(三)捕获异常

.NET Framework提供了大量的预定义基类异常对象。为了在C#代码中处理可能的错误情况,一般要把程序的相关部分分成3种不同类型的代码块。

try块包含的代码组成了程序的正常操作部分,但这部分程序可能遇到某些严重的错误。

catch块包含的代码处理各种错误情况,这些错误是执行try块中的代码时遇到的。

finally块包含的代码清理资源或执行通常要在try块或catch块末尾执行的其他操作(无论是否抛出异常,finally块都会执行)。

try
{
    //代码
}
catch (Exception)
{
    //可以设置多个catch捕捉不同的异常(捕捉顺序从上往下)
}
finally {
    //可省略
}

1、实现多个catch块

try
{
    //代码
}
catch (IOException)
{
    //可以设置多个catch捕捉不同的异常(捕捉顺序从上往下)
}
catch (Exception)
{
    //可以设置多个catch捕捉不同的异常(捕捉顺序从上往下)
}
finally {
    //可省略
}

最先编写的catch块用于处理非常特殊的错误情况,接着是比较一般的块,它们可以处理任何错误,我们没有为它们编写特定的错误处理程序。catch块的顺序很重要,如果以相反的顺序编写这两个块,代码就不会编译,因为第二个catch块是不会执行的。

2、System.Exception属性

var exception = new Exception();
exception.Data["ErrorDate"] = DateTime.Now;//添加异常的额外信息的第一种方法
exception.Data.Add("AdditionalInfo","异常附加信息");//添加异常的额外信息的第二种方法
exception.HelpLink = "excption.txt";//异常的帮助文件
exception.Source = "测试异常应用";//导致异常的应用程序名或对象名

以上为Exception的可写属性,除此以外还有可读属性。InnerException是在catch块中抛出的,它就会包含把代码发送到catch块中的异常对象;Message描述错误情况的文本;StackTrace栈上方法调用的详细信息;TargetSite描述抛出异常的方法的.NET反射对象。

3、嵌套的try块

 1 try
 2 {
 3     //外层代码A
 4     //(此处抛出异常,由外层异常处理)
 5     try
 6     {
 7         //内层代码
 8         //(此处抛出异常,如果内层异常能够处理则处理,否则由外层异常处理)
 9         //注意:如果内层不能处理异常,则在执行完finally内方法后,
10         //寻找外层匹配异常处理,这个时候外层代码B没有运行
11     }
12     catch (Exception)//内层异常处理
13     {
14         //可以设置多个catch捕捉不同的异常(捕捉顺序从上往下)
15         //(此处抛出异常,由外层异常处理)
16     }
17     finally
18     {
19         //可省略
20         //(此处抛出异常,由外层异常处理)
21     }
22     //外层代码B
23     //(此处抛出异常,由外层异常处理)
24 }
25 catch (Exception)//外层异常处理
26 {
27     //可以设置多个catch捕捉不同的异常(捕捉顺序从上往下)
28 }
29 finally
30 {
31     //可省略
32 }

(四)用户定义的异常类

class Program
{
    static void Main(string[] args)
    {
        try
        {
            //2、抛出自定义异常
            throw new MyException("自定义异常信息");
        }
        catch (MyException ex)//3、捕获自定义异常
        {
            Console.WriteLine(ex.Message );
        }
    }
}
//1、自定义异常类
public class MyException : Exception
{
    //将异常信息传入基类构造函数
    public MyException(string message) :base(message)
    {}
    public MyException(string message,Exception innerException) : base(message,innerException)
    { }
}

(五)调用者信息

在处理错误时,获取错误发生位置的信息。C#5.0提供了一种新功能,可以用特性和可选参数获得这些信息(定义在System.Runtime.CompilerServices)。

 1 static void Main(string[] args)
 2 {
 3     var p = new Program();
 4     p.Log();
 5     p.SomeProperty = 33;
 6     Action a = () => p.Log();
 7     a();
 8 }
 9 private int someProperty;
10 public int SomeProperty
11 {
12     get { return someProperty; }
13     set {
14         this.Log();
15         someProperty = value;
16     }
17 }
18 public void Log([CallerLineNumber] int line = -1, [CallerFilePath]string path = null, [CallerMemberName]
19 string name = null)
20 {
21     Console.WriteLine((line < 0) ? "No Line" : "Line " + line);
22     Console.WriteLine((path == null) ? "No file path" : "Line " + path);
23     Console.WriteLine((name == null) ? "No member name" : "Line " + name);
24     Console.WriteLine();
25 }

运行以上代码,结果如下:

时间: 2024-10-05 23:59:39

【读书笔记】C#高级编程 第十六章 错误和异常的相关文章

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用   <canvas> var drawing = document.getElementById("drawing"); if( drawing.getContext ){ drawing.getContext("2d"

R in action读书笔记(22)第十六章 高级图形进阶(下)

16.2.4 图形参数 在lattice图形中,lattice函数默认的图形参数包含在一个很大的列表对象中,你可通过trellis.par.get()函数来获取,并用trellis.par.set()函数来修改.show.settings()函数可展示当前的图形参数设置情况.查看当前的默认设置,并将它们存储到一个mysettings列表中: > show.settings() > mysettings<-trellis.par.get() 查看叠加点的默认设置值: > mysett

R in action读书笔记(21)第十六章 高级图形进阶(上)

16.1 R 中的四种图形系统 基础图形函数可自动调用,而grid和lattice函数的调用必须要加载相应的包(如library(lattice)).要调用ggplot2函数需下载并安装该包(install.packages("ggplot2")),第一次使用前还要进行加载(library(ggplot2)). 16.2 lattice 包 lattice包为单变量和多变量数据的可视化提供了一个全面的图形系统.在一个或多个其他变量的条件下,栅栏图形展示某个变量的分布或与其他变量间的关系

读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px" 计算的样式 记住所有计算的样式都是只读的 偏移量 offsetHeight 外边框外 offsetWidth offsetLeft  外边框外 到 左端 offsetTop  客户区的大小 clientWidth  内边框外缘 clientHeight 内边框外缘 滚动大小 scrollHeight

R in action读书笔记(19)第十四章 主成分和因子分析

第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因子分析(EFA)是一系列用来发现一组变量的潜在结构的方法.它通过寻找一组更小的.潜在的或隐藏的结构来解释已观测到的.显式的变量间的关系. PCA与EFA模型间的区别 主成分(PC1和PC2)是观测变量(X1到X5)的线性组合.形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个

R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验

第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被随机分配到其中一种条件(A或B)中,相应的结果变量(score)也已经被记录.实验结果如下: 如果两种处理方式真的等价,那么分配给观测得分的标签(A处理或B处理)便是任意的.为检验两种处理方式的差异,我们可遵循如下步骤: (1) 与参数方法类似,计算观测数据的t统计量,称为t0: (2) 将10个得

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

【读书笔记】C#高级编程 第二十二章 安全性

(一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序的用户.Principal是一个包含用户的标识和用户所属角色的对象. AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); var principal = WindowsPrincipal.Curr

【读书笔记】C#高级编程 第十四章 内存管理和指针

(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64位更多,这个内存包括可执行代码和加载的DLL,以及程序运行时使用的变量内容). 在处理器的虚拟内存中,有一个区域称为栈.栈存储不是对象成员的值数据类型. 释放变量时,其顺序总是与它们分配内存的顺序相反,这就是栈的工作方式. 程序第一次运行时,栈指针指向为栈保留的内存块末尾.栈实际上是向下填充的,即从