捕获异常

前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描写叙述一下异常的捕获和处理.

案例代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 异常处理

{

class Program

{

int result;

Program()

{

result = 0;

}

public void DisPlay(int a, int b)

{

try//这个话可能有问题

{

result = a / b;

}

catch (DivideByZeroException e) //不知道这个异常代表什么自己去查,有过那句话真的有问题,我就得治它

{

Console.WriteLine("Exception caught: {0}", e);

}

finally//无论怎样,以下这句话我必须得输出

{

Console.WriteLine("Result: {0}", result);

}

}

static void Main(string[] args)

{

Program p = new Program();

p.DisPlay(25, 0);

Console.ReadKey();

}

}

}

别和我说你看不懂,唯一看不懂得地方就是哪一点try-catch语句的地方,我都凝视好了(你试试没有try-catch语句会咋样?===>假设没有try,程序会终止)

简单说点其它小内容:

try ... catch 的目的是解决程序在出现错误时无法继续运行下去的问题。

try不一定仅仅能和catch 配对,也能够try{}finally{}这种形式,这不是没有意义,由于这样能够保证即使发生了异常,finally里面的代码一定会被运行。有时候,这个还是很实用的。

比方能够用来释放一些自己占用的资源。然后让调用者处理异常。

对异常的捕获由三个部分组成:

try { //运行的代码,当中可能有异常。

一旦发现异常。则马上跳到catch运行。否则不会运行catch里面的内容 } catch { //除非try里面运行代码发生了异常,否则这里的代码不会运行 } finally { //无论什么情况都会运行,包含try catch 里面用了return ,能够理解为仅仅要运行了try或者catch,就一定会运行 finally }

Try语句

Catch语句

Finally语句

try -- 意思是 “试一试” 

catch --  意思是 “抓”,抓一抓。 

没有错,就抓不到错。有错才干抓到并处理。

一个try能够跟随意个catch(个数没有限制)。主要是看有多少个异常类型。包括自己定义的,Eeception是个类, 申明一个ex的Eeception对象,这个ex里面包括了当前发生在捕捉到的try块的全部异常信息,如ex.Message最经常使用的 (try块的具体异常信息),

ex的位置:仅仅能在cath块 (异常处理块)

ex的作用:保存着系统捕获的异常;

为什么要用ex:  由于你不是神。并不能预測到你的程序会出什么错。所以就用

 MessageBox.Show(ex.Message);让系统提示你程序错在哪里,就能够顺藤摸瓜,逮到错误源从而解决他!

假设catch语句捕获了try语句不可能抛出的异常时,代码将不能通过,假设catch语句中使用例如以下方式:catch( Exception  e ){ }将在不论什么情况下。编译都能通过。

•try{    DataConnection.Open();    DataCommand.ExecuteReader();    ...    return;}finally{    DataConnection.Close();}

不管是否抛出异常,也不管在catch 中从什么地方return返回,finally语句块总是会运行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败。关闭操作永远是能够运行的),以便于释放已经产生的连接,释放资源。

另外说明。return是能够放在try语句块中的。但无论在什么时机返回,在返回前,finally将会运行。

throw(不止throws)的作用是当代码运行到此处时觉得的让程序出错。出错原因是你指定的内容

catch的作用是try包括的内容执行出错时,catch扑捉到try里面出错的原因,至于对于这个错误你怎么操作就放在catch里,你能够把错误写日志,messagebox输出等等

备注:throw是语句,抛出一个异常 ; throws是方法抛出一个异常;

throw语法: throw <异常对象>

(C#中是没有throws的,JAVA里有!别搞错了)throws语法 : [修饰符] <返回值类型> <方法名>([參数列表]) [throws <异常类>]

当中:异常类能够声明多个,用逗号分隔.

上面的那个案例,你试试经catch语句里的内容换成下面内容?

throw e;(应该会程序终止)

也能够换成这样:

throw new Exception("出错啦。", e);//这个时候也会终止程序,你注意看终止信息!!!

注意在捕获并抛出异常时应使用 throw new Exception("出错啦!", ex); 方式,则可获得异常的详细位置。

当在VS调试或者DEBUG模式下执行程序成都可获得异常发生的详细位置。

但当在独立执行的RELEASE模式下时,异常仅仅会记录最初的调用位置。

当运行文件夹不包括 *.pdb 文件时,异常信息中不会包括代码及行号信息。

最后以一个案例结束异常捕获的部分:

class Program

{

static void Main(string[] args)

{

string userInput;

while (true)

{

try

{

Console.WriteLine("请输入0到5之间的随意一个数字: ");

userInput = Console.ReadLine();

if (userInput == "")

{

//当用户输入""时,跳出try和while可是仍然运行finally

break;

}

int index = Convert.ToInt32(userInput);

if (index < 0 || index > 5)

{

//抛出异常

//可使用System.Exception类,可是该类是个基本类,,没有包括特定错误信息

//此处可用派生类IndexOutRangeException

throw new IndexOutOfRangeException("请你看看要求好不好,你输入的是: " + userInput);

}

Console.WriteLine("你输入了:" + index);

}

//传递给catch块的參数仅仅能用于该catch块,因此兴许catch块仍然可用同名參数ex

catch (IndexOutOfRangeException ex)

{

Console.WriteLine("异常了: " + ex.Message);

}

/*

* 假设没有前面catch块中捕获的异常类,这个也能处理IndexOutOfRangeException

* 计算机仅仅运行它在catchh块列表中找到的第一个合适的catch块

* 基类的一个引用可一直想派生于他的全部类实例

* 因此,最上面的catch块应用于最特殊的异常情况,最后的是一般的catch块

*

*/

catch (Exception ex)

{

Console.WriteLine("抛出异常: " + ex.Message);

}

/*

* 最一般的catch块(不带參数),用于处理其它没用C#编写的代码抛出的异常

* C#中仅仅有派生于System.Exception类的实例才干作为一场抛出,其它语言没这个限制

* 此catch块相同捕获所有异常,仅仅是不知异常的具体信息

*/

catch

{

//由于我们不知道这个异常表示什么类

Console.WriteLine("不知道什么异常,你自己猜去把.");

}

//不管运行try,catch最后都运行finally块

finally

{

Console.WriteLine("无论咋样,我都得运行,哥就是牛X");

}

/* 没有处理异常时发生的情况

* 生成一个异常后,代码中没有catch块能处理这异常。由.NET执行库捕获

* .NET执行库把整个程序放在还有一个更大的try块中,用一个catch处理捕获全部异常

*/

}

}

}

注意:一般编写一个可运行程序,硬不货异常,编写一个库,最好不要补货,要家丁调用代码能够处理.

C#高级编程八十一天----捕获异常的更多相关文章

  1. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

  2. C#编程(八十一)---------- 捕获异常

    捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描述一下异常的捕获和处理. 案例代码: using System; using System.Coll ...

  3. Unix环境高级编程(八)进程关系

    本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候 ...

  4. C#高级编程八十三天----程序集的含义

    程序集的含义 一.程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在非常多文件(类,窗口,接口,资源 ...

  5. 【读书笔记】C#高级编程 第二十一章 任务、线程和同步

    (一)概述 所有需要等待的操作,例如,因为文件.数据库或网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务. 线程是程序中独立的指令流. (二)Paraller类 Paraller ...

  6. C#高级编程四十一天----用户定义的数据类型转换

    用户定义的数据类型转换 C#同意定义自己的 数据类型,这意味着须要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...

  7. Unix环境高级编程(二十一)数据库函数库

    本章的内容是开发一个简单的.多用户数据库的C函数库.调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录.绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁 ...

  8. C#高级编程八十二天----用户自己定义异常类

    用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样.   为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...

  9. 【读书笔记】C#高级编程 第十一章 LINQ

    (一)LINQ概述 语言集成查询(Language Integrated Query,LINQ)在C#编程语言中继承了查询语法,可以用相同的语法访问不同的数据源. 1.LINQ查询 var query ...

随机推荐

  1. [HNOI2012]矿场搭建(tarjan求点双)

    题目 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无 ...

  2. Bzoj3652 大新闻

    Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 215  Solved: 112 Description Input ...

  3. MongoDB如何使用“”用户名和密码“”

    在去年的 DB 勒索事件之后, 不少的同学开始加强 Mongodb 的安全性, 其中一种办法就是设置复杂的密码. 那么问题来了, 如果设置的密码里包含一些如 “@”, “:” 一样的特殊字符怎么办? ...

  4. nginx报404的可能错误

    1.转移地址写错,如root E:software_setup\ftpfile,而你实际的目录地址(比如test.jpg)在ftpfile文件夹里面的img文件夹下,如果直接找ftpfile\test ...

  5. hibernate中SQL包含冒号

    当前负责的项目使用的是hibernate,而“:”是hibernate的一个占位符,作为预编译使用的, select tmp.pid from (select pid, loginTime, @i : ...

  6. Interview | Why are manhole covers round and not square or rectangular?

    Manholes, which interconnect underground sewerage pipes, and serve as a point of entry for cleaning ...

  7. 【转】浅谈多核CPU、多线程、多进程

    浅谈多核CPU.多线程.多进程 1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核3 ...

  8. SQLServer出现不允许保存更改的问题解决

    如图所示: 解决方法: [工具]->[选项]

  9. Linux shell 提取文件名和目录名的一些方法(转)

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.tx ...

  10. MapWindowPoints

    中文名 MapWindowPoints Windows CE 1.0及以上版本 头文件 winuser.h 库文件 user32.lib MapWindowPoints函数把相对于一个窗口的坐标空间的 ...