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. CFA

    拜耳色彩滤波阵列(Bayer Color Filter Array, CFA)是非常有名的彩色图片的数字采集格式.由1/2的G,1/4得R,1/4的B组成. 当Image Sensor向外逐行输出数据 ...

  2. linux常用命令(替换)

    1. vi 模式下的替换命令: s 表示替换(substitute),g表示全局搜索(global search) :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vi ...

  3. Instagram 在 PyCon 2017 的演讲摘要

    Instagram 在 PyCon 2017 的演讲摘要 PyCon 简介 PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会.大会由 Python 社区组织,每年举办一次.在大会 ...

  4. jquery easyUI相关

    jquery easyUI相关===================================easyUI表单验证处理//jquery easyUI 表单验证不通过让光标定位在第一个未通过验证的 ...

  5. 开源|如何使用CNN将视频从2D到3D进行自动转换(附源代码)

    http://www.sohu.com/a/128924237_642762 全球人工智能 文章来源:GitHub 作者:Eric Junyuan Xie 它是如何运行的? 在运行代码之前,请先根据官 ...

  6. P4281 [AHOI2008]紧急集合 / 聚会

    P4281 [AHOI2008]紧急集合 / 聚会 lca 题意:求3个点的lca,以及3个点与lca的距离之和. 性质:设点q1,q2,q3 两点之间的lca t1=lca(q1,q2) t2=lc ...

  7. LOJ10066 新的开始

    LOJ10066 新的开始 prim 典型题.碰到这种情况,只要建一个虚拟节点,和其他的点连边,按题目给权值即可 代码中把n+1当成虚拟节点 懒得写kruskal就用prim了 #include< ...

  8. Java 实现后缀xls文件读取

    Java 实现后缀xls文件读取 一.开发环境 poi采用的3.9版本 + JDK1.6 + Myeclipse 二,JAR包 三.实现代码 实体类:UserRoleBean package nc.x ...

  9. Sybase 删除表的某列

    Sybase 删除表的某列 Sybase 删除表的某列sql: --想删除字段temp1(该字段的所有值已置为null) alter table nh_bill_detail drop temp1;

  10. 查看 nodejs 安装包的相关指令

    npm -h 以上指令可以看到npm可用的指令 如果要卸载就用npm uninstall