.NET基础 (07)异常的处理
异常的处理
1 如何针对不同的异常进行捕捉
2 如何使用Conditional特性
3 如何避免类型转换时的异常
异常的处理
1 如何针对不同的异常进行捕捉
C#中一个try块可以有多个catch块,每个catch块可以针对特别的异常进行特别的处理。但是安全起见,最后应该添加一个对象Exception类型的异常捕捉的catch块,以保证没有异常被毫无处理地抛出。
实例代码如下:
class CatchException
{
static void Main(string[] args)
{
CatchException ce = new CatchException();
ce.RiskWork();
Console.Read();
} public void RiskWork()
{
try
{
/*
一些预计可能产生异常的代码
*/
}
catch (NullReferenceException ex)
{
HandleExpectedException(ex);
}
catch (ArgumentException ex)
{
HandleExpectedException(ex);
}
catch (FileNotFoundException ex)
{
HandleError(ex);
}
catch (Exception ex)
{
HandleCrash(ex);
}
} //这里处理预计可能会发生的,不属于错误范畴的异常
private void HandleExpectedException(Exception ex)
{
Console.WriteLine(ex.ToString());
} //这里处理在系统出错时可能会发生的,比较严重的异常
private void HandleError(Exception ex)
{
Console.WriteLine(ex.ToString());
throw ex; //严重的异常,抛到上层处理
} private void HandleCrash(Exception ex)
{
Console.WriteLine(ex.ToString());
System.Threading.Thread.CurrentThread.Abort();
}
}
2 如何使用Conditional特性
Conditional特性用于编写在某个特定编译版本中运行的方法,通常它编写一些在Debug版本中支持测试的方法。当版本不匹配时,编译器会把Conditional特性的方法内容置空。
示例代码:
//含有两个成员,生日和身份证
//身份证的第6位到第14位必须是生日
//身份证必须是18位
public class People
{
private DateTime _birthday;
private String _id; public DateTime Birthday
{
set
{
_birthday = value;
if (!Check())
throw new ArgumentException();
}
get
{
Debug();
return _birthday;
}
}
public String ID
{
set
{
_id = value;
if (!Check())
throw new ArgumentException();
}
get
{
Debug();
return _id;
}
}
public People(String id,DateTime birthday)
{
_id = id;
_birthday = birthday;
Check();
Debug();
} //只希望在DEBUG版本中出现
[Conditional("DEBUG")]
protected void Debug()
{
Console.WriteLine(_birthday.ToString("yyyy-MM-dd"));
Console.WriteLine(_id);
}
//检查是否符合业务逻辑
//在所有版本中都需要
protected bool Check()
{
if (_id.Length != ||
_id.Substring(, ) != _birthday.ToString("yyyyMMdd"))
return false;
return true;
}
static void Main(string[] args)
{
try
{
People p = new People("",
new DateTime(, , ));
p.ID = "";
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.GetType().ToString());
}
finally
{
Console.Read();
}
}
}
下面分别是Debug版本和Release版本的输出:
Debug版本:
1980-08-01
310101198008010031
System.ArgumentException
Release版本:
System.ArgumentException
3 如何避免类型转换时的异常
用 is 和 as 语句代替强制类型转换,可以有效避免InvalidCaseException 异常,执行效率相对较高。
示例代码:
public class UseIsAs
{
static void Main(string[] args)
{
Base b = new Base();
Son s = new Son();
String mystring = "我的类型不匹配";
DateTime n = DateTime.Now; //对三套方法进行验证,结果应该是一样的
CastToBase1(b);
CastToBase1(s);
CastToBase1(mystring);
CastToBase1(n);
CastToBase2(b);
CastToBase2(s);
CastToBase2(mystring);
CastToBase2(n);
CastToBase3(b);
CastToBase3(s);
CastToBase3(mystring);
CastToBase3(n);
Console.Read();
}
//用is进行转换
static void CastToBase1(Object o)
{
if (o is Base)
{
Base b = (Base)o;
Console.WriteLine(b.ToString());
}
else
Console.WriteLine("转换失败");
}
//用as进行转换
static void CastToBase2(Object o)
{
Base b = o as Base;
if(b!=null)
Console.WriteLine(b.ToString());
else
Console.WriteLine("转换失败");
}
static void CastToBase3(Object o)
{
try
{
Base b = (Base)o;
Console.WriteLine(b.ToString());
}
catch
{
Console.WriteLine("转换失败");
}
}
} /// <summary>
/// 简单的基类和子类
/// </summary>
public class Base
{
public override string ToString()
{
return "我是基类";
}
}
public class Son : Base
{
public override string ToString()
{
return "我是子类";
}
}
输出结果:
我是基类
我是子类
转换失败
转换失败
我是基类
我是子类
转换失败
转换失败
我是基类
我是子类
转换失败
转换失败
转载请注明出处:
作者:JesseLZJ
出处:http://jesselzj.cnblogs.com
.NET基础 (07)异常的处理的更多相关文章
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javascript基础07
javascript基础07 1.节点 元素.childNodes : 属性 只读 属性 子节点列表集合 元素.childNodes 只包含子节点,不包含孙节点 DOM节点的类型有很多种,w3c标准有 ...
- java_基础_异常
之前只是了解的最基础的异常形式,没有过多的深入 今天因为一些原因了解了一下 下面来说说异常的几种形式 1.try-catch语句块 代码示例 class test{ public static voi ...
- 十九. Python基础(19)--异常
十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try: <............. ...
- Hadoop基础-常见异常剖析之防坑小技巧
Hadoop基础-常见异常剖析之防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- java基础之异常 · fossi
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...
- Java基础巩固——异常
基础回顾 什么是异常? 在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误.根据其性质可以分为错误和异常. Java程序中所有抛出的异常都必须从Throwable派生而来.类Thr ...
- Java基础 匿名内部类 异常 多线程 集合面试题
匿名内部类:没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口. 匿名内部类的格式 ...
- 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- JAVA基础知识|异常
一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...
随机推荐
- node操作mongoDB数据库的最基本例子
连接数据库 var mongo=require("mongodb"); var host="localhost"; var port=mongo.Connect ...
- JS中的面向对象
创建对象的几种常用方式: 1,使用Object或对象字面量创建对象. 2,工厂模式创建对象. 3,构造函数模式创建对象. 4,原型模式创建对象. 使用Object或对象字面量创建对象: var stu ...
- mongodb分片(七)
1.插入负载技术分片架构图 2.片键的概念和用处 看下面这个普通的集合和分片后的结果 3.什么时候用到分片呢? 3.1机器的磁盘空间不足 3.2单个的mongoDB服务器已经不能满足大量的插入操作 3 ...
- Django xadmin的使用 (三)
关于报错: 1.在页面添加好新的用户后登录报错 解决方法: 新建一个app,名叫app D:\myfiles\study\python\django\datas>python manage.py ...
- 【转】内存耗用:VSS/RSS/PSS/USS
Terms VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS- Prop ...
- druid 连接池的配置
dataSource配置 <!-- 基于Druid数据库链接池的数据源配置 --> <bean id="dataSource" class="com ...
- Proxmox VE 设置备忘
现在PROXMOX 虚拟机一共两个(使用的是N3700 cpu的一个小机器主要为了省电.) 一个是ROS,经过折腾,IK8速度还不错就是资源占用比较大特比下载数据大时对CPU占用很大:OpenWRT不 ...
- Linux 登陆提示文字
/etc/issue是从本地登陆显示的信息 /etc/issue.net是从网络登陆显示的信息 /etc/motd内容由系统管理员确定,常用于通告信息,如计划关机时间的警告等 每次用户登录时,/etc ...
- 学习python必备的学习网站
Django框架学习必备网站: 官方网站 https://www.djangoproject.com/ 1.11版英文文档 https://docs.djangoproject.com/en/ ...
- ie8、9 post 跨域
//显示浮层postAjax:function(url,param,callback){ var loadScore = layer_.load(1,{shade: [0.8,'#393D49']}) ...