C# 异常处理

  异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。

  异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。

  try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。

  catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。

  finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。

  throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

  语法

  假设一个块将出现异常,一个方法使用 try 和 catch 关键字捕获异常。try/catch 块内的代码为受保护的代码,使用 try/catch 语法如下所示:

  try

  {

  // 引起异常的语句

  }

  catch( ExceptionName e1 )

  {

  // 错误处理代码

  }

  catch( ExceptionName e2 )

  {

  // 错误处理代码

  }

  catch( ExceptionName eN )

  {

  // 错误处理代码

  }

  finally

  {

  // 要执行的语句

  }

  您可以列出多个 catch 语句捕获不同类型的异常,以防 try 块在不同的情况下生成多个异常。

  C# 中的异常类

  C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception 类。System.ApplicationException 和 System.SystemException 类是派生于 System.Exception 类的异常类。

  System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。

  System.SystemException 类是所有预定义的系统异常的基类。

  下表列出了一些派生自 Sytem.SystemException 类的预定义的异常类:

  异常类描述

  System.IO.IOException处理 I/O 错误。

  System.IndexOutOfRangeException处理当方法指向超出范围的数组索引时生成的错误。

  System.ArrayTypeMismatchException处理当数组类型不匹配时生成的错误。

  System.NullReferenceException处理当依从一个空对象时生成的错误。

  System.DivideByZeroException处理当除以零时生成的错误。

  System.InvalidCastException处理在类型转换期间生成的错误。

  System.OutOfMemoryException处理空闲内存不足生成的错误。

  System.StackOverflowException处理栈溢出生成的错误。

  异常处理

  C# 以 try 和 catch 块的形式提供了一种结构化的异常处理方案。使用这些块,把核心程序语句与错误处理语句分离开。

  这些错误处理块是使用 try、catch 和 finally 关键字实现的。下面是一个当除以零时抛出异常的实例:

  using System;

  namespace ErrorHandlingApplication

  {

  class DivNumbers

  {

  int result;

  DivNumbers()

  {

  result = 0;

  }

  public void division(int num1, int num2)

  {

  try

  {

  result = num1 / num2;

  }

  catch (DivideByZeroException e)

  {

  Console.WriteLine("Exception caught: {0}", e);

  }

  finally

  {

  Console.WriteLine("Result: {0}", result);

  }

  }

  static void Main(string[] args)

  {

  DivNumbers d = new DivNumbers();

  d.division(25, 0);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Exception caught: System.DivideByZeroException: Attempted to divide by zero.

  at ...

  Result: 0

  创建用户自定义异常

  您也可以定义自己的异常。用户自定义的异常类是派生自 ApplicationException 类。下面的实例演示了这点:

  using System;

  namespace UserDefinedException

  {

  class TestTemperature

  {

  static void Main(string[] args)

  {

  Temperature temp = new Temperature();

  try

  {

  temp.showTemp();

  }

  catch(TempIsZeroException e)

  {

  Console.WriteLine("TempIsZeroException: {0}", e.Message);

  }

  Console.ReadKey();

  }

  }

  }

  public class TempIsZeroException: ApplicationException

  {

  public TempIsZeroException(string message): base(message)

  {

  }

  }

  public class Temperature

  {

  int temperature = 0;

  public void showTemp()

  {

  if(temperature == 0)

  {

  throw (new TempIsZeroException("Zero Temperature found"));

  }

  else

  {

  Console.WriteLine("Temperature: {0}", temperature);

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  TempIsZeroException: Zero Temperature found

  抛出对象

  如果异常是直接或间接派生自 System.Exception 类,您可以抛出一个对象。您可以在 catch 块中使用 throw 语句来抛出当前的对象,如下所示:

  Catch(Exception e)

  {

  ...

  Throw e

  }

  本文转载自:w3cschool(编辑:雷林鹏 来源:网络)

雷林鹏分享:C# 异常处理的更多相关文章

  1. 雷林鹏分享:Ruby 异常

    Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在 ...

  2. 雷林鹏分享:CodeIgniter 数据库操作

    在平时项目开发过程中,除了处理那些繁琐的逻辑过程外,还有一个重要的任务就是对数据库的操作处理.这里总结下自己平时使用CI过程中使用的如何对数据库进行操作处理. 在CI框架中,我们一般会把对数据库的操作 ...

  3. 雷林鹏分享:YAF路由问题

    这2天休年假,在家宅着学习研究了YAF框架,用YAF做过APP接口的项目,但是没有用来做过WEB方面的应用.趁着这2天在家想把博客用YAF进行一下改版,目的也想进一步学习一下YAF. 在这过程中遇到不 ...

  4. 雷林鹏分享:url中加号引发的错误

    刚发现了博客的一个bug,标签页中一些标签带有空格,在url输出中使用了 urlencode 函数进行处理,导致空格被转换成了加号(+),这时通过url访问时会出现错误: 临时解决方法是在urlcod ...

  5. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...

  6. 雷林鹏分享:Laravel 安装

    前面我们介绍我了 composer安装,这里我们接着来介绍 Laravel框架的安装. 这里我们安装的是laravel 4 项目下载地址:https://github.com/laravel/lara ...

  7. 雷林鹏分享:CodeIgniter常用的数据库操作类

    在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作. 初始化数据库类 依据你的数据库配置载入并初始化数据库类: $this->lo ...

  8. 雷林鹏分享:jQuery EasyUI 数据网格 - 设置冻结列

    jQuery EasyUI 数据网格 - 设置冻结列 本实例演示如何冻结一些列,当用户在网格上移动水平滚动条时,冻结列不能滚动到视图的外部. 为了冻结列,您需要定义 frozenColumns 属性. ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建复杂工具栏

    jQuery EasyUI 数据网格 - 创建复杂工具栏 数据网格(datagrid)的工具栏(toolbar)可以包含按钮及其他组件. 您可以通个一个已存在的 DIV 标签来简单地定义工具栏布局,该 ...

随机推荐

  1. discuz财付通也阵亡了

    今日做交易部分,然后焦头烂额. 首先这积分,威望,金钱,什么鬼,乱七八糟的...... 然后这支付宝,啊,,,,,竟然停止个人接口了,不得已要使用财付通. %&……*&……&不 ...

  2. MFC CFile类读写文件详解

    CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 一个读写文件的例子: 文件I/O 虽然使用CArchive类内建的序列化 ...

  3. Openstack创建虚拟机 Restful api和RPC调用

    Horizon前台界面用于接受用户的输入或动作(action),然后将这些参数构造成RESTful API(https://developer.openstack.org/api-ref/comput ...

  4. mysql系统变量查询

    mysql系统变量包括全局变量(global)和会话变量(session),global变量对所有session生效,session变量包括global变量.mysql调优必然会涉及这些系统变量的调整 ...

  5. 把kafka数据从hbase迁移到hdfs,并按天加载到hive表(hbase与hadoop为不同集群)

    需求:由于我们用的阿里云Hbase,按存储收费,现在需要把kafka的数据直接同步到自己搭建的hadoop集群上,(kafka和hadoop集群在同一个局域网),然后对接到hive表中去,表按每天做分 ...

  6. linux基础命令---bzip2

    bzip2 使用Burrows-Wheeler块排序文本压缩算法,将文件进行压缩,压缩比率比一般算法高一些.bzip2要求命令行标志附带一个文件名列表.每个文件都被自己的压缩版本替换,名称为“orig ...

  7. 2018“金三”之一线互联网公司Java高级面试题总结

    JVM 1.请介绍一下JVM内存模型??用过什么垃圾回收器都说说呗 2.线上发送频繁full gc如何处理? CPU 使用率过高怎么办? 如何定位问题?如何解决说一下解决思路和处理方法 3.知道字节码 ...

  8. ssh连接linux服务器不断开- "Write failed: Broken pipe"

    我自己用阿里云的服务器的时候,发现ssh连上以后,一会不用就断掉了,非常不方便,服务端的系统是ubuntu. 查了些东西,原来可以去配置服务端的sshd,或者客户端的ssh,就行了. 1,配置服务器端 ...

  9. Observer模式实践

    Observer 模式在实践中的应用场景: 为 Point 类设计一个数据绑定机制,当其坐标 x 或 y 被更改时,可以通知外界其更改的过程.将更改过程打印在控制台上.考虑使用松耦合设计. 代码: # ...

  10. Spark样本类与模式匹配

    一.前言 样本类(case class)与模式匹配(pattern matching)是Scala中一个比较复杂的概念,往往让人感觉深陷泥沼.我在这里对Scala中的样本类与模式匹配进行了一些整理,希 ...