【读书笔记】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 }
运行以上代码,结果如下:
【读书笔记】C#高级编程 第十六章 错误和异常的更多相关文章
- C#高级编程9 第16章 错误和异常
C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- R in action读书笔记(22)第十六章 高级图形进阶(下)
16.2.4 图形参数 在lattice图形中,lattice函数默认的图形参数包含在一个很大的列表对象中,你可通过trellis.par.get()函数来获取,并用trellis.par.set() ...
- R in action读书笔记(21)第十六章 高级图形进阶(上)
16.1 R 中的四种图形系统 基础图形函数可自动调用,而grid和lattice函数的调用必须要加载相应的包(如library(lattice)).要调用ggplot2函数需下载并安装该包(inst ...
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ...
- R in action读书笔记(19)第十四章 主成分和因子分析
第十四章:主成分和因子分析 本章内容 主成分分析 探索性因子分析 其他潜变量模型 主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分.探索性因 ...
- R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验
第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被 ...
- 【读书笔记】C#高级编程 第十九章 程序集
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...
- 【读书笔记】C#高级编程 第二十四章 文件和注册表操作
(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByR ...
随机推荐
- linux web漏洞扫描arachni
1. 下载arachni https://www.arachni-scanner.com/download/下载Linux x86 64bit 2. 上次解压直接使用 tar xzf arachni- ...
- 利用laravel-echo主动向服务端发送消息,实现在线状态管理
之前在网上翻了半天,也没有找到关于如何 通过laravel-echo主动发送消息 和 在laravel-websockets中自定义控制器 的文章或教程.无奈之下只能翻laravel-echo和lar ...
- CentOS7使用LVM缩减/home空间,扩大/空间
CentOS7使用LVM缩减/home空间,扩大/空间方法:把/home里的内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/文件系统.新建/home,恢复/home的原内容1.查看默认分区[ ...
- PTA(BasicLevel)-1018 锤子剪刀布
一.问题定义 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如下: 剪刀 > 布, 锤子 > 剪刀, 布 > 锤子 现给出两人的交 ...
- 异构图神经网络笔记-Heterogeneous Graph Neural Network(KDD19)
自己讲论文做的异构图神经网络的ppt.再转变成博客有点麻烦,所以做成图片笔记. 论文链接:https://arxiv.org/abs/1903.07293
- .NET ORM框架HiSql实战-第三章-使用自定义编号生成【申请编号】
一.引言 上一篇.NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查) 中菜单编号采用的是雪花ID,生成的编号无法自定义.比如本系统的一个申请业务,需要按前缀+日期+流水号 ...
- Test_day01月_总结
1)Object是所有类的超类,在java.lang包中 2)标识符命名规则 3)八种基本数据类型有哪些?每种类型所占的字节数? 整数直接量默认为int类型 浮点数直接量默认为double类型 4)字 ...
- 我们应该测试 DAO 层吗?
应该测试 DAO 层吗? 网上有很多人讨论单元测试是否应该包含 DAO 层的测试.笔者觉得,对于一些主要是crud的业务来说,service层和controller层都会非常薄,而主要的逻辑都落在ma ...
- CSDN 原力(声望,影响力) -- 设计草案
目标 CSDN 希望成为开发者学习,成长和成就的平台.我们已经有很多功能来支持开发者的职业成长了, 如何衡量成就呢?我们希望用 原力 (以前也叫 影响力,声望) 来体现用户的成就, 并希望用原力来帮助 ...
- MySQL建表DDL规范(欢迎补充)
MySQL建表DDL规范(欢迎补充) 基本规范: 表名和字段名全大写,一般表名以T开头 脚本需支持可重复执行,带IF NOT EXISTS ,但不可带DROP语句 字符集使用utf8mb4 (CHAR ...