建议68:从System.Exception或其他常见的基本异常中派生异常
来源:互联网 发布:手机淘宝旧版本下载 编辑:程序博客网 时间:2024/04/29 16:12
建议68:从System.Exception或其他常见的基本异常中派生异常
微软建议:从System.Exception或其他常见基本异常之一派生异常。在Visual Studio中输入Exception,然后按快捷键Tab,VS会自动创建一个自定义异常类:
[Serializable] public class MyException : Exception { // // For guidelines regarding the creation of new exception types, see // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp // and // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp // public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } protected MyException( SerializationInfo info, StreamingContext context) : base(info, context) { } }
这是一个标准的自定义异常,它同时告诉你,你所创建的异常必须是可序列化的,因为你必须保证异常是可以穿越AppDomain边界的。
如果你需要从一个基本异常派生自定义异常,则类似这样声明:
[Serializable] public class MyException : IOException
一般来说,以上的描述已经满足你对于自定义异常的普通需求,但是另一个需求是,你也许会想要格式化异常的Message。比如,为一个考试系统设计一个自定义的加密异常:PaperEncryptException,我们需要格式化一些异常信息。所以,必须重写(override)异常类的Message属性,如下所示:
[Serializable] public class PaperEncryptException : Exception, ISerializable { private readonly string _paperInfo; public PaperEncryptException() { } public PaperEncryptException(string message) : base(message) { } public PaperEncryptException(string message, Exception inner) : base(message, inner) { } public PaperEncryptException(string message, string paperInfo) : base(message) { _paperInfo = paperInfo; } public PaperEncryptException(string message, string paperInfo, Exception inner) : base(message, inner) { _paperInfo = paperInfo; } protected PaperEncryptException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } public override string Message { get { return base.Message + " " + _paperInfo; } } public override void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("Args", _paperInfo); base.GetObjectData(info, context); } }
PaperEncryptException与MyException相比,有两个明显的不同:
1)实现了接口ISerializable。
2)重写了方法GetObjectData。
这是因为我们给PaperEncryptException定义了一个新的字段_paperInfo。为了确保新定义的字段也能被序列化,必须要让异常类型实现ISerializable接口,并且需要将字段加入到GetObjectData方法的SerializationInfo参数中。
测试代码如下:
try { throw new PaperEncryptException("加密试卷失败", "学生ID:123456"); } catch (PaperEncryptException err) { Console.WriteLine(err.Message); }
输出:
“加密试卷失败 学生ID:123456”
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
0 0
- 建议68:从System.Exception或其他常见的基本异常中派生异常
- 从exception派生自己的异常类
- Java中常见的异常(Exception)
- Spring常见的十八中异常Exception
- 常见的Java异常Exception
- java中5种常见的异常(Exception)
- java.lang.Exception 中常见异常的解释
- java中5种常见的异常(Exception)
- Java开发中常见的异常(Exception)
- 常见的几种异常类型Exception
- 最常见到的runtime exception 异常
- 异常详细信息: System.InvalidCastException: 对象不能从 DBNull 转换为其他类型——的解决方法
- Java常见异常(Runtime Exception)
- System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 异常-常见的异常
- Operation System: Exception (操作系统的异常控制流)
- Java中常见的异常
- Java中常见的异常
- C语言语句
- 直接插入排序之Java实现
- iOS日历、日期、时间的计算
- http协议
- java.util.regex.Pattern类使用
- 建议68:从System.Exception或其他常见的基本异常中派生异常
- extjs TriggerAction:"all"
- Realm 开发参考资料
- 仿射变换
- 【华为OJ】寻找等差数列
- 多线程-CountDownLatch
- android中MD5加密工具类
- OC中字符串的简单操作
- 每天10个面试题(day05)