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. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  2. linux常用命令:systemctl 命令

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 1.命令格式: systemctl [参数] [服务] 2.命令功能: syst ...

  3. centos 安装sftp服务

    打开命令终端窗口,按以下步骤操作. 0.查看openssh的版本 ssh -V 使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级.  1.创建sftp组 ...

  4. Django框架----Web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  5. python之路----黏包的解决方案

    黏包的解决方案 远程执行命令 # server 下发命令 给client import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) ...

  6. nginx做http向https的自动跳转

    在访问百度时,在浏览器输入www.baidu.com会自动跳转到https://www.baidu.com不用人工干预,nginx也可以做这样的自动跳转! 首先让nginx服务器监听两个端口,分别是8 ...

  7. Linux下Tomcat端口、进程以及防火墙设置

     Linux下Tomcat端口.进程以及防火墙设置 1,查看tomcat进程: #ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个 ...

  8. elasticsearch分词器ik

    1. 下载和es配套的版本 git clone https://github.com/medcl/elasticsearch-analysis-ik 2. 编译 cd elasticsearch-an ...

  9. Node-webkit 安装使用npm安装模块方法

    原文链接:http://jingyan.baidu.com/article/5225f26b5aaa20e6fa0908a6.html package.json可以放在软件根目录下,也可以放在项目目录 ...

  10. VC++实现程序重启的方法(转载)

    转载:http://blog.csdn.net/clever101/article/details/9327597 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是杀死 ...