异常的处理
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)异常的处理的更多相关文章

  1. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  2. javascript基础07

    javascript基础07 1.节点 元素.childNodes : 属性 只读 属性 子节点列表集合 元素.childNodes 只包含子节点,不包含孙节点 DOM节点的类型有很多种,w3c标准有 ...

  3. java_基础_异常

    之前只是了解的最基础的异常形式,没有过多的深入 今天因为一些原因了解了一下 下面来说说异常的几种形式 1.try-catch语句块 代码示例 class test{ public static voi ...

  4. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

  5. Hadoop基础-常见异常剖析之防坑小技巧

    Hadoop基础-常见异常剖析之防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. java基础之异常 · fossi

    在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...

  7. Java基础巩固——异常

    基础回顾 什么是异常? 在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误.根据其性质可以分为错误和异常. Java程序中所有抛出的异常都必须从Throwable派生而来.类Thr ...

  8. Java基础 匿名内部类 异常 多线程 集合面试题

    匿名内部类:没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口. 匿名内部类的格式 ...

  9. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  10. JAVA基础知识|异常

    一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...

随机推荐

  1. 将 .NET 任务作为 WinRT 异步操作公开

    转自:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/22/net-winrt.aspx 在博文深入探究 Await 和 WinRT ...

  2. 5月12日上课笔记-js 弹出框、函数、程序调试、基本事件、浏览器对象模型

    一.弹出框 a.提示框 alert(); b.输入框 prompt(); c.确认框 confirm(); var flag= confirm("确认删除吗?"); 二.js程序调 ...

  3. 浅谈PHP面向对象编程(一、简介)

    传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...

  4. 几个常用的Linux监控脚本

    几个常用的Linux监控脚本 几个常用的Linux监控脚本下面是几个主机监控的脚本,大家可以根据自己的情况再进行修改,希望能给大家一点帮助.1.查看主机网卡流量#!/bin/bash#network# ...

  5. Linux HDD information (SATA/SCSI/SAS/SSD)

    举例一: [reistlin@reistlin.com ~]$ cat /proc/scsi/scsi | grep Model Vendor: ATA Model: OCZ-VERTEX2 3.5 ...

  6. HTTP接口开发专题一(四种常见的 POST 提交数据方式对应的content-type取值)

    application/x-www-form-urlencoded 这应该是最常见的 POST 提交数据的方式了.浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 app ...

  7. javascript常见方法汇总之一——数组字符串相关

    (转载至慕课网) 原文链接:https://www.imooc.com/article/46933 github地址:https://github.com/dorseysen/notes-about- ...

  8. Python常用的一些内建函数和math模块函数

    一:Python内建函数 # abs取绝对值 num = -10 print(abs(num)) # max 求最大值 print(max(6, 9, 2, 12, 8)) # min求最小值 pri ...

  9. golang的array/slice

    相同点 由相同类型的元素组合构成 元素有序排列,0为第一个元素下标 基本使用方法相同 区别 array声明时需要指定容量大小,而且无法修改 slice可通过append增加元素,当容量不够时,会自动扩 ...

  10. 并发编程之IO模型比较和Selectors模块

    主要内容: 一.IO模型比较分析 二.selectors模块 1️⃣ IO模型比较分析 1.前情回顾: 上一小节中,我们已经分别介绍过了IO模型的四个模块,那么我想大多数都会和我一样好奇, 阻塞IO和 ...