CLR via C# 笔记 -- 异常和状态管理(20)
1. 异常是指成员没有完成它的名称所宣称的行动,异常类继承System.Exception。
2. .Net Framework 异常处理机制是用Microsoft windows提供的结构化异常处理(Structured Exception Handing, SEH)机制构建的。
3. AppDomain的FirstChanceException事件登记,只要AppDomain发生异常,就会收到通知,通知是在CLR开始搜索任何catch快之前发生的。
4. 由于其他语言不一定要继承Exception,CLR 2.0引入System.Runtime.ComplierServices.RuntimeWrappedException 对其他语言进行包装。
5. System.Exception属性
1) Message:包含辅助性文字说明,指出抛出异常的原因。如果抛出的异常未处理,该消息通常被写入日志。由于最终用户一般不看这种消息,所以消息应提供尽可能多的技术细节。
2) Data:键值对集合,代码抛出异常前在该集合中添加记录项;捕捉异常的代码可在异常恢复过程中查询记录项并利用其中信息。
3) Source:包含生成异常的程序集的名称。
4) StackTrace:包含抛出异常之前调用过的所有方法的名称和签名,该属性对调试很有用。
5) InnerException:如果当前异常是在处理一个异常时抛出的。该属性就指出上一个异常是什么。这个只读属性通常为null。Exception类型还提供了公共方法GetBaseException来遍历由内层异常构成的链表
6. 重新抛出异常
try { ... }
catch (Exception e)
{
...
throw e; // CLR 认为这是异常的起点
}
try { ... }
catch (Exception e)
{
...
throw; // 不影响CLR对异常起点的认知。FxCop不再报错
}
7. 如果能找到你的程序集的调用符合(存储在.pdb文件中),那么在System.Exception的StackTrace属性或者System.Diagnostics.StackTrace的Tostring()方法返回的字符串中,将包括源代码文件路径和代码行号,这些信息对于调试是很有用的。
8. [assembly: System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute.DebuggingModes.DisableOptimizations)] JIT编译器不会对程序集的方法进行内联。
9. [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] 禁止JIT编译器在调试和发布生成(debug and release build)时对该方法进行内联处理。
10. 定义异常类 1). 尽量创建少的基类。原因是基类的主要作用就是将大量错误当作一个错误,而这通常是危险的。基于同样的考虑,永远都不要抛出一个System.Exception对象,抛出其他任何基类异常类型时也要特别谨慎。
class Program
{
static void Main(string[] args)
{
try
{
throw new Exception<DiskFullExceptionArgs>(new DiskFullExceptionArgs("C:/"), "The disk is full");
}
catch (Exception<DiskFullExceptionArgs> e)
{
Console.WriteLine(e.Message);
}
}
} [Serializable]
public sealed class Exception<TExceptionArgs> : Exception, ISerializable
where TExceptionArgs : ExceptionArgs
{
private const string c_args = "Args"; // 用于(反)序列化
private readonly TExceptionArgs m_args;
public TExceptionArgs Args { get { return m_args; } } public Exception(string message = null, Exception innerException = null)
:this(null, message, innerException)
{ } public Exception(TExceptionArgs args, string msssage = null, Exception innerException = null)
:base (msssage, innerException)
{
m_args = args;
} // 这个构造器用于反序列化;由于类是密封的,所以构造器是私有的
// 如果这个类不是密封的,这个构造器就应该是受保护的
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
private Exception(SerializationInfo info, StreamingContext context)
: base(info, context)
{
m_args = (TExceptionArgs)info.GetValue(c_args, typeof(TExceptionArgs));
} // 这个方法用于序列化;由于 ISerializable 接口,所以它是公共的
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(c_args, m_args);
base.GetObjectData(info, context);
} public override string Message
{
get
{
string baseMsg = base.Message;
return (m_args == null) ? baseMsg : baseMsg + "(" + m_args.Message + ")";
}
} public override bool Equals(object obj)
{
Exception<TExceptionArgs> other = obj as Exception<TExceptionArgs>;
if (other == null) return false;
return Object.Equals(m_args, other.m_args) && base.Equals(obj);
} public override int GetHashCode()
{
return base.GetHashCode();
}
} [Serializable]
public abstract class ExceptionArgs
{
public virtual string Message { get { return string.Empty; } }
} /// <summary>
/// 代表磁盘满的异常类
/// </summary>
[Serializable]
public sealed class DiskFullExceptionArgs : ExceptionArgs
{
private readonly string m_diskpath; // 在构造时设置的私有字段 public DiskFullExceptionArgs(string diskpath)
{
m_diskpath = diskpath;
} // 返回字段的公共只读属性
public string DiskPath { get { return m_diskpath; } } public override string Message => m_diskpath == null ? base.Message : "DiskPath=" + m_diskpath;
}
CLR via C# 笔记 -- 异常和状态管理(20)的更多相关文章
- 对CLR异常和状态管理的一点理解
一:自己的感悟 今天读到<CLR via C#>的异常和状态管理这一章,作者给出了关于异常处理的诸多建议,里面有一些建议自己深有体会,比如说使用可靠性换取开发效率这一节.之前自己对异常怎么 ...
- 读书笔记—CLR via C#异常和状态管理
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- [CLR via C#]异常和状态管理
当CLR检测到某个正在运行的.NET应用程序处于一种特殊的正常执行顺序被打断的状态时,会生成一个异常对象来表示这个错误,并将此对象在方法调用堆栈中向上传送.如果一个程序引发了一个异常却没有处理,CLR ...
- 【C#进阶系列】20 异常和状态管理
异常就是指成员没有完成它的名称所宣示的行动. public class Girl { public string Name { get; set; } } public class Troy{ Gir ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Vue.js 2.x笔记:状态管理Vuex(7)
1. Vuex简介与安装 1.1 Vuex简介 Vuex是为vue.js应用程序开发的状态管理模式,解决的问题: ◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题 ◊ 不同状态中 ...
- EntityFramework中对象的状态管理(笔记)
刚开始接触EF框架的时候总是不明白: 为什么查询出来的对象 Remove().再 SaveChanges()就会把数据删除.而自己 new 一个Person()对象,然后 Remove()不行? 为什 ...
- Servlet学习笔记06——什么是转发,路径,状态管理?
1.include指令 (1)作用: 告诉容器,在将jsp转换成Servlet时,将 某个文件的内容插入到该指令所在的位置. (2)语法: <%@ include file="&quo ...
- CLR如何将SEH异常映射到托管异常类型
托管异常处理构建在Windows操作系统的结构化异常处理之上,通常称为SEH.这意味着CLR了解如何在SEH和托管异常系统之间进行互操作,这是一个非常关键的点,因为SEH基于异常代码的概念,而托管异常 ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
随机推荐
- C# 获取指定文件夹中所有的文件(包括子文件夹的文件)
有个需求中需要播放指定路径的声音,但你必须要有该路径的声音才可以播放,如果没有该文件则播放默认的声音,该方法用于初始化应用的时候获取指定目录的所有文件,便于后来播放声音的时判断路径是否存在. usin ...
- aliyun全站DCDN刷新--Django
1.编写原因: 由于登录到阿里云DCDN,需要登录加打开各种页面,导致推送一次感觉非常麻烦,所以编写(网上以有很多可以借鉴) 2.基础环境 # 所需模块 pip install aliyun-pyth ...
- Oracle和达梦:根据外键名字查询表名
根据外键名字查询表名 select * from user_cons_columns cl where cl.constraint_name = '外键名';
- 云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
01 方案概述 现在绝大多数客户都有很多非结构化的数据存在 OSS 中,以图片,视频,音频居多.举一个图片处理的场景,现在各种终端种类繁多,不同的终端对图片的格式.分辨率要求也不同,所以一张图片往往会 ...
- PHP游戏线下线上陪玩平台APP小程序H5源码开发多少钱?可用于家政,陪诊,陪伴服务等
做陪玩app项目,不少创业者们都比较头疼该如何去选择软件系统!目前软件市场上,陪玩app平台的软件系统五花八门,价位也是参差不齐.创业者们都比较纠结是定制开发,还是选择开元源码二次开 发? 前两天成都 ...
- ContextCapture-硬件配置推荐
ContextCapture倾斜摄影的空三计算.三维建模应用.非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间. 硬件常见问题 随着倾斜摄影建模算法成熟,应用越来越广泛,数据量越来越大,需 ...
- C语言:冒泡排序---详细解释
//冒泡排序数字,仅仅适用于数组无序的时候,若有序则不能使用冒号排序 例如: 数字组:5,54,64,98,47 /* 1: 54,64,98,47,5 4次 ...
- 基于AIRIOT平台构建低成本、更聪明的智能环卫系统,让管理更加高效智能
环卫工程作为城市基础设施保障,是城市建设管理中不可或缺的重要组成部分.随着城市进程的加快及技术的进步,环卫工程管理也在逐渐向精细化.智能化.绿色化等趋势发展. 智能环卫依托物联网.AI.大数据等技术, ...
- 腾讯云服务器sdk
参考:https://cloud.tencent.com/document/product/494/7244 pip install -i https://mirrors.tencent.com/py ...
- SimpleHTTPServer模块详解
SimpleHTTPServer实现文件的展示和下载 可以用python2.7直接启动一个进程.以命令执行的当前目录为页面根目录,如果不存在index.html,默认展示当前目录的所有文件. pyth ...