一步一步学习C#语言【异常处理】

1、异常的概念

异常是在运行期间代码中产生的错误,或者由代码调用的函数产生的错误。

示例:    int[] myArray = {1, 2, 3, 4};

myArray[4] = 5;

运行上述代码会产生如下异常信息:

Index was outside the bounds of the array.

产生的异常叫做System.IndexOutOfRangeException(数组下标越界异常)。

2、异常处理

C#包含结构化异常处理语法。

可以使用try、catch和finally三个关键字标记出能处理异常的代码和指令,如果发生异常,就使用指令处理异常。

它们都有一个关联代码块,必须在连续的代码行中使用。

3、异常处理基本结构

   try
   {
       // code block
   }
   catch(<exceptionType> e)
   {
       // code block
   }
   finally
   {
       // code block 
   }
  • 可以只有try块和finally块,而没有catch块,或者有一个try块和好几个catch块。
  • 如果有一个catch块或多个catch块,finally块是可选,否则是必选的。
  • try块:包含抛出异常的代码。抛出分两种:生成或导致。
  • catch块:包含抛出异常时要执行的代码。catch块可以使用<exceptionType>,设置只响应特定的异常类型,以便提供多个catch块。可省略参数,让一般catch块响应所有异常。
  • finally块:包含总是会执行的代码,如果没有产生异常,则在try块执行完后执行,如果产生异常,则在catch块后执行,或者在未处理的异常上移到调用堆栈之前执行。

    上移到调用堆栈表示,结构化异常处理允许嵌套try...catch...finally,可以直接嵌套,也可以在try块包含的函数调用中嵌套。例如,如果在被调用的函数没catch能处理某个异常,就由调用代码中的catch块处理。如果始终没有catch块处理,则终止应用程序。finally块在此之前处理,是因为存在这个块,否则也可以在try...catch...finally结构的外部放置代码。

4、异常发生后事件处理顺序

  • try块在发生异常的地方中断执行程序。
  • 如果有catch块,就检查该块是否匹配已抛出的异常类型。
  • 如果没有catch块,就执行finally块。
  • 如果有catch块,但它与发生异常的类型不匹配,就检查是否有其他catch块。
  • 如果有catch块匹配已发生的异常类型,就执行它包含的代码,再执行finally块。
  • 如果catch块都不匹配已发生的异常类型,就执行finally块。

5、异常处理注意事项

  • 必须先捕获特殊异常,再处理一般异常。
  • catch块中也可以抛出异常。
  • 如果在catch块中抛出异常,将由上一级代码处理异常。

6、异常处理示例

using System;
namespace TException
{
    class program
    {
        static string[] eTypes = { "none", "simple", "index", "nested index" };
        static void Main(string[] args)
        {
            foreach(string eType in eTypes)
            {
                try
                {
                    Console.WriteLine("Main() try block reached.");
                    Console.WriteLine("ThrowException(\"{0}\")", eType);
                    ThrowException(eType);
                    Console.WriteLine("Main() try block continue.");
                }
                catch(System.IndexOutOfRangeException e)
                {
                    Console.WriteLine("Main() System.IndexOutOfRangeException catch block reached. Message: \n\"{0}\"", e.Message);
                }
                catch
                {
                    Console.WriteLine("Main() general catch block reached.");
                }
                finally
                {
                    Console.WriteLine("Main() finally block reached.");
                }
                Console.WriteLine();
            }
        }
        static void ThrowException(string exceptionType)
        {
            Console.WriteLine("ThrowException(\"{0}\") reached.", exceptionType);
            switch(exceptionType)
            {
                case "none":
                Console.WriteLine("Not throwing an exception.");
                break;
                case "simple":
                Console.WriteLine("Throwing System.Exception.");
                throw(new System.Exception());
                break;
                case "index":
                Console.WriteLine("Throwing System.IndexOutOfRangeException.");
                eTypes[4] = "error";
                break;
                case "nested index":
                try
                {
                    Console.WriteLine("ThrowException(\"nested index\") try block reached.");
                    Console.WriteLine("ThrowException(\"index\") called.");
                    ThrowException("index");
                }
                catch
                {
                    Console.WriteLine("ThrowException(\"nested index\") general catch block reached.");
                    throw(new System.Exception());
                }
                finally
                {
                    Console.WriteLine("ThrowException(\"nested index\") finally block reached.");
                }
                break;
            }
        }
    }
}

结果显示:

时间: 2024-10-16 05:34:19

一步一步学习C#语言【异常处理】的相关文章

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish

一步一步学习Swift之(一):关于swift与开发环境配置

一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣. 4.Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发. 5.Swift 是编写 iOS 和 OS X 应用的极佳手段,并将伴随着新的特性和功能持续演进.

一步一步学习androidNDK编程(java给c传递数据)

这篇已经是"一步一步学习androidNDK编程"的第四篇了,在这篇中,我们将会在java中传递代码给c代码. 首先,我们新建一个android工程"ndkdata", 第一步: 同样的首先声明native方法,如下: public native int add(int a,int b); public native String helloSir(String name); public native int[] intMethod(int[] intArray)

一步一步学习Vue(十一)

本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var list = []; var Todo = (function () { var id = 1; return function (title, desc) { this.title = title; this.desc = desc; this.id = id++; } })(); /** *

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

这两天加班,不能兼顾博客的更新,请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容,而我们又想像数据库那样能直接体现在查询中,这里就是我们所说的增量索引.对于这样的需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的: 这里我们一般可能会想到,将之前的索引全部删除,然后进行索引的重建.对于这种做法,如果数据源的条数不是特别大的情况下倒还可以,如果数据源的条数特别大的话,势必会造成查询数据耗时,同时索引的构建也是比较耗时的,几相叠加,势必可能造成查询的时候数据缺失的情况

一步一步跟我学习lucene(9)---lucene搜索之拼写检查和相似度查询提示(spellcheck)

suggest应用场景 用户的输入行为是不确定的,而我们在写程序的时候总是想让用户按照指定的内容或指定格式的内容进行搜索,这里就要进行人工干预用户输入的搜索条件了:我们在用百度谷歌等搜索引擎的时候经常会看到按键放下的时候直接会提示用户是否想搜索某些相关的内容,恰好lucene在开发的时候想到了这一点,lucene提供的suggest包正是用来解决上述问题的. suggest包联想词相关介绍 suggest包提供了lucene的自动补全或者拼写检查的支持: 拼写检查相关的类在org.apache.

一步一步学习IdentityServer3 (1)

学习之初: IdentityServer3我自己最开始了解到的就是做一个SSO单点登录,后面发现还有单独的认证服务功能,其实它还可以做APIs的访问控制,资源授权,另外还可以为提供第三方登录,其他的自由定制目前也在学习中. 网络飞速发展的今天,庞大的数据,庞大的用户,庞大的业务,都需要登录的支撑,登录授权完全看作一个单独的一门技术,Web端需要登录,App端需要登录,Api需要授权访问等等,除此以外大型业务系统,子系统之间其实也需要这样一个登陆授权,所以,登录不再是单一的一个功能点了,简单的查询

一步一步学习SignalR进行实时通信_8_案例2

原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建立DrawingHub 页面 javascript 实现效果 结束语 参考文献 前言 这讲分析一个案例,在一个画板上画画实时在其他客户端上显示. 配置Hub 在Startup中进行配置: public void Configuration(IAppBuilder app) { app.MapSign

一步一步跟我学习lucene(13)---lucene搜索之自定义排序的实现原理和编写自己的自定义排序工具

自定义排序说明 我们在做lucene搜索的时候,可能会需要排序功能,虽然lucene内置了多种类型的排序,但是如果在需要先进行某些值的运算然后在排序的时候就有点显得无能为力了: 要做自定义查询,我们就要研究lucene已经实现的排序功能,lucene的所有排序都是要继承FieldComparator,然后重写内部实现,这里以IntComparator为例子来查看其实现: IntComparator相关实现 其类的声明为 public static class IntComparator exte

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt