.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 ...
随机推荐
- folly学习心得(转)
原文地址: https://www.cnblogs.com/Leo_wl/archive/2012/06/27/2566346.html 阅读目录 学习代码库的一般步骤 folly库的学习心得 ...
- Android利用百度云来识别身份证及各种证件的信息
上一篇中我已经介绍过了ocr,及google出来的tess-two的使用. 接下来我来介绍一个更方便的身份证识别系统,当然它本身也是利用ocr来识别文字的,不过它处理的更好,可以为我们提供更快,更准确 ...
- 数据结构和算法之单向链表二:获取倒数第K个节点
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...
- canvas绘制圆弧
canvas绘制圆弧 方法 anticlockwise为true表示逆时针,默认为顺时针 角度都传的是弧度(弧度 = (Math.PI/180)*角度) arc(x, y, radius, start ...
- 一个简单的异常/条件重试类(C#)
单个类,简单好用 using System; using System.Linq.Expressions; using System.Threading; using System.Threading ...
- Shiro异常处理总结
出自:https://blog.csdn.net/goodyuedandan/article/details/62420120 一.Spring MVC处理异常有3种方式: (1)使用Spring-M ...
- Console2支援中文顯示的正式設定法
1.用regedit找到HKEY_CURRENT_USER\Console,把底下的Console2 command window機碼給砍了.2.Console2的View功能表中,有個Console ...
- Thymeleaf 条件语句
Thymeleaf 条件语句 Posted on 2017-09-15 if 与 unless 假如现在有一个商品列表,当商品有评论时,显示view按钮,否则不显示.这时候就可以使用Thymelea ...
- 小程序开发运营必看:微信小程序平台运营规范
一.原则及相关说明 微信最核心的价值,就是连接——提供一对一.一对多和多对多的连接方式,从而实现人与人.人与智能终端.人与社交化娱乐.人与硬件设备的连接,同时连接服务.资讯.商业. 微信团队一 ...
- Opencv读取图片像素值
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...