.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 ...
随机推荐
- SVN的学习
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS 为什么需要SVN 通常软件开发由多人协作开发,如果对代码文件.配置文 ...
- 简单租房子实例详解---(session、ajax、json前后台数据处理、分页)
本次实例我们结合session.ajax.json前后台数据处理.分页技术做一个租房信息系统 一共有五个界面:包括 管理员和用户的登录界面 登录界面的后台 <?php session_start ...
- PolyBase 指南
PolyBase 是一种可通过 t-sql 语言访问数据库外部数据的技术.PolyBase is a technology that accesses data outside of the data ...
- linux-强制断开远程tcp连接
最近在做日常维护,搭建了socks代理,但是socks代理服务已经关闭了,由于其他机器还在和我的服务器保持tcp长连接 e.g. tcp ESTAB Google了一下,没找到特别好的办法,例如ipt ...
- Python Object Oriented
1. Creating class class className: 'Optional class documentation string' class_suite The class has a ...
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
- 走了很多弯路的CCScrollView
最近在学习Cocos2d-x,学习CCScrollView的时候走了很多弯路,决定记录下来. 学习cocos2d-x的最大的困惑就是资料不是很齐全,网上有很多资料,但是版本差异大,其次深度低,讲解不够 ...
- Flask之模板web表单
3.3 Web表单: web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过 ...
- 表单验证常用的JS正则表达式
在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,本文收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份 ...
- postman的使用方法详解
Collections:在Postman中,Collection类似文件夹,可以把同一个项目的请求放在一个Collection里方便管理和分享,Collection里面也可以再建文件夹.如果做API文 ...