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. Understanding Convolutional Neural Networks for NLP

    When we hear about Convolutional Neural Network (CNNs), we typically think of Computer Vision. CNNs ...

  2. Hive 大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...

  3. python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法

    生成指定长度的随机数字密码 生成指定长度的随机字母密码 生成指定长度的随机数字和字母的混合 #encoding=utf-8   import random import string class pa ...

  4. Linux服务器---apache支持SSL

    Apache支持ssl 1.检测是否安装ssl模块,如果没有就安装 [root@localhost cgi-bin]# rpm -qa | grep mod_ssl           //查看是否安 ...

  5. linux 中的定时任务crontab使用方法

    linux 中的定时任务crontab使用方法: 切换到root用户,sudo su root (可以设置成不需要输入密码) sudo su - (需要输入当前帐号的密码才能进入.) crontab ...

  6. spoj1825 Free tour II

    题目链接 一道神奇的点分治 貌似有很多做法,我觉得BIT要好些一些(雾 要求经过黑点数<k就用BIT区间查询前缀 对于每个点用  BIT[0,k-经过黑点数]的最大值+路径长度 使用点分治做到O ...

  7. 在uboot中加入cmd_run命令,运行环境变量

    在学习uboot的过程中会经常烧录程序,每次都要敲一些下载指令.这样是不是很麻烦,有什么办法能快速的烧写呢.很简单,将需要敲击的指令编译到uboot中,以环境变量的形式存在.但是环境变量很好加,如何运 ...

  8. JavaScript甜点(1)

    甜点1:什么是脚本语言? 脚本语言是由传统编程语言简化而来的,它与传统的编程语言既有很多相似之处,又有很多的不同之处.脚本语言的最显著的特点是:首先它不需要编译成二进制,以文本的形式存在:其次就是脚本 ...

  9. Android MediaPlayer 操作

  10. c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )

    转载:http://blog.csdn.net/goodai007/article/details/7414512 头文件:ZipAndFile.h //----------------------- ...