C#高级编程八十一天----捕获异常
捕获异常
前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描写叙述一下异常的捕获和处理.
案例代码:
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#高级编程八十一天----捕获异常的更多相关文章
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C#编程(八十一)---------- 捕获异常
捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描述一下异常的捕获和处理. 案例代码: using System; using System.Coll ...
- Unix环境高级编程(八)进程关系
本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候 ...
- C#高级编程八十三天----程序集的含义
程序集的含义 一.程序集是包括一个或多个类型定义文件和资源文件的集合.它同意我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在非常多文件(类,窗口,接口,资源 ...
- 【读书笔记】C#高级编程 第二十一章 任务、线程和同步
(一)概述 所有需要等待的操作,例如,因为文件.数据库或网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务. 线程是程序中独立的指令流. (二)Paraller类 Paraller ...
- C#高级编程四十一天----用户定义的数据类型转换
用户定义的数据类型转换 C#同意定义自己的 数据类型,这意味着须要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以 ...
- Unix环境高级编程(二十一)数据库函数库
本章的内容是开发一个简单的.多用户数据库的C函数库.调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录.绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁 ...
- C#高级编程八十二天----用户自己定义异常类
用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样. 为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...
- 【读书笔记】C#高级编程 第十一章 LINQ
(一)LINQ概述 语言集成查询(Language Integrated Query,LINQ)在C#编程语言中继承了查询语法,可以用相同的语法访问不同的数据源. 1.LINQ查询 var query ...
随机推荐
- PHP-CI框架数据库连接默认是长连接,需要注意应用场景
在CI框架的数据库配置文件中$db['default'] ['pconnect'] = TRUE,永久的数据库连接是指在您的脚本结束运行时不关闭的连接. 当收到一个永久连接的请求时,PHP将检查是否已 ...
- Iframe载入页面 及 跳转页面
原文发布时间为:2009-05-05 -- 来源于本人的百度文章 [由搬家工具导入] 第一个文件 frame1.html <!DOCTYPE html PUBLIC "-//W3C// ...
- 时间戳/Date(1354116249000)/ 转换
从C#的Datatime格式通过Json传到Js里面,时间会显示成时间戳/Date(1354116249000)/ ,js转化如下 function GetDateFormat(str) { retu ...
- shell 执行提示No such file or directory
问题描述: 项目开发过程中ansible执行脚本失败,单独运行shell脚本提示:No such file or directory,脚本结构执行脚本a 调用另一脚本b, 但查看b脚本路径正确不存在找 ...
- 当一个窗体上有PageControl 控件时,是先执行 FormShow呢,还是先执行PageControl 的 TabSheet2Show呢
答案是 先执行 TabSheet2Show ,总算知道了,顺便推理 Onshow事件的执行顺序是 从内到外,先执行容器内的控件的事件,再执行 窗体的事件
- JS-严格模式、非严格模式
2018年11月14日晚上,我在“深入理解javascript”书上第一次知道“严格模式”“非严格模式”这2个名词: “严格模式”使用指令:“use strict”: 这个指令我其实有经常看到,在其他 ...
- Codeforces 901C Bipartite Segments(Tarjan + 二分)
题目链接 Bipartite Segments 题意 给出一个无偶环的图,现在有$q$个询问.求区间$[L, R]$中有多少个子区间$[l, r]$ 满足$L <= l <= r &l ...
- 网站优化—MySQL优化
MySQL优化 简介 由于页面静态化技术可以实现对动态数据的缓存,但是有的时候还是需要去请求数据库.所以对数据库的优化也是不可缺少的. 优化思路 设计:存储引擎,字段,范式 自身:索引,自身的缓存 架 ...
- 洛谷——P2383 狗哥玩木棒
P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...
- 两个本质相同的dp
1.划分数 描述:给定数字N,将其划分为不超过K组,求不同的划分的总数(比如4——1 2 1,2 1 1就算做一种划分) 2.Dollar Dayz 描述:给定数字N,将其随意划分,但是组成数字不可以 ...