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. Intro to Python for Data Science Learning 5 - Packages

    Packages From:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-3-functio ...

  2. HTTP 超文本协议

    转载 :http://mp.weixin.qq.com/s/3d3zhksViX2NTuIssiYGJg

  3. jQuery ajax 请求HttpServlet返回[HTTP/1.1 405 Method not allowed]

    1.问题使用jQuery的ajax请求 Servlet 时,返回没有进入ajax的success回调函数,浏览器控制台显示 [HTTP/1.1 405 Method not allowed]. 2.解 ...

  4. mysql系统变量查询

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

  5. window开机启动项设置和取消方法

    window开机启动项1.添加开机启动项:开始-->所有程序-->启动-->双击(xp系统)或右键打开,把需要启动的软件快捷键拖放进去即可,遇到安全软件的拦截,只需选择 " ...

  6. 20145301赵嘉鑫《网络对抗》Exp8 Web基础

    20145301赵嘉鑫<网络对抗>Exp8 Web基础 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,主要负责数据采集部分.表单元素允许用户在表单中输入信息.一个表单有三个基本 ...

  7. 20165310_java_blog_week1.md

    2165310 <Java程序设计>第1周学习总结 教材学习内容总结 了解Java基本配置环境 学习Java命名.编译.运行规则 拓展学习包的编译.运行 熟悉Git的运用方式 教材学习中的 ...

  8. codevs1001 舒适的路线 - 贪心 - 并查集

    题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...

  9. Eclipse的快捷键使用总结

    最近一直在使用Idea开发项目,导致之前一直使用的Eclipse快捷键忘记的差不多了,现在稍微整理了一些,方便以后可以快速切换回来. 常用的Eclipse快捷键总结: Ctrl+S 保存当前正在编辑的 ...

  10. neuroph Perceptron Sample

    错误: Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory     ...