.NET----错误和异常处理机制
前言
错误的出现并不总是编写程序的人的原因,有时应用程序会因为应用程序的最终用户引发的动作或运行代码的环境发生错误。无论如何,我们都应预测应用程序中出现的错误,并相应的进行编码。
.Net改进了处理错误的方式。C#处理错误的机制可以为每种错误提供自定义处理方式,并把识别错误的代码与处理错误的代码分别开来。
异常类
在C#中当出现某个特殊的异常错误条件时,就会创建抛出一个异常对象,这个对象包含有助于跟踪问题的信息。.Net提供了许多预定义的异常类,我们下面看看一些常见特别的异常类吧(异常类太多了,这里就介绍几个常见的)。
对于.Net类,一般的异常类System.Exception派生自System.Object,通常不在代码中抛出System.Exception泛型对象,因为他们无法确定错误情况的本质。
在该层次中有两个重要的类,他们派生自System.Exception类:
- SystemException------该类用于通常由.NET允许库抛出的异常,或者由几乎所有的应用程序抛出的异常。例如,如果.NET运行库检测到栈已满,他就会抛出StackOverflowException异常。另一方面,如果检测到调用方法时参数不对,就可以在自己的代码中选择抛出ArgumentException异常或其子类。SystemException异常的子类包括表示致命错误和非致命错误的异常。
- ApplicationException----在.NET Framework最初的设计中,是打算把这个类作为自定义应用程序异常类的基类的。不过,CLR抛出的一些异常类也派生自这个类。应用程序抛出的异常则派生自SystemException。因此从ApplicationException派生自自定义异常类型没有任何好处,取而代之的是,可以直接从Exception基类派生自定义异常类。
其他可能会用到的异常类包括:
- StackOverflowException-------如果分配给栈的内存区域已满,就会抛出这个异常。如果一个方法连续地递归调用自己,就可能发生栈溢出。这一般是一个致命错误,因为它禁止应用程序执行除了中断以外的其他任务。在这种情况下,甚至也不可能执行到finally块。通常用户自己不能处理像这样的错误,而应退出应用程序。
- EndOfStreamException-------这个异常通常是因为读到文件末尾而抛出的,流表示数据源之间的数据流。
- OverflowException-----如果要在checked上下文中把包含-40的int类型数据强制转换为uint数据,就会抛出这个异常
- MemberAccessException----------该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)
- IndexOutOfException-------该类用于处理下标超出了数组长度所引发的异常
使用try...catch...finally捕获异常
- try 块包含的代码组成了程序的正常操作部分,但这部分程序可能会遇到某些严重的错误。
- catch块包含的代码处理各种错误,这些错误是执行try块中的代码时遇到的问题。这个快可以用来记录错误。
- finally快包含的代码清理资源或执行通常要在try块或者catch块末尾执行的其他操作。无论是否抛出异常,都会执行finally块。finally块中防止return语句,编译器会标记一个错误。另外此块可以如果没有需要关闭或者处理的其他操作可以省略此块。
异常处理具有性能含义,在常见的情况下,不应该使用异常处理错误。应尽量编写好避免错误出现的代码。
在异常捕获中,我们可以实现多个catch块来针对不同的错误做出对应的错误处理。下面我们看一个例子:
class Program
{
static void Main(string[] args)
{
while (true)
{
try
{
string userInput;
Console.WriteLine("请输入0-5之间任意一个数字:");
userInput = Console.ReadLine();
if (string.IsNullOrWhiteSpace(userInput))
{
break;
} if (int.TryParse(userInput, out int index))
{
if (index < || index > )
{ throw new IndexOutOfRangeException($"你输入的数字是{index}"); }
Console.WriteLine($"你输入的数字是{index}");
}
else
{
throw new Exception("请输入数字");
}
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"你输入的数字不在此范围内.{ex.Message}");
}
catch (Exception ex)
{ Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("谢谢合作");
} }
}
}
在此事例中,定义了两个catch块。如果输入的超过规定返回的数字,则会抛出超出范围的错误也就进入对应的catch块。而输入的非数字也就进入了另外一个catch块进行处理。
下面我们看一看关于System.Exception属性。熟悉了解其中熟悉能更好的去观察理解抛出的异常错误。

过滤异常、创建用户定义的异常
自从C#6开始就支持异常过滤器。Catch块仅在过滤器但会true时执行。捕获不同的异常类型时,可以有行为不同的代码块。在某些情况下,catch块基于异常的内容执行不同的操作。下面我们看下如何来使用异常过滤器吧:
public class MyIndexOutOfException :SystemException
{
public MyIndexOutOfException(string message) : base(message)
{ } public int ErrorCode { get; set; }
} class Program
{
static void Main(string[] args)
{
try
{
int steInput = ; if (steInput > )
{
throw new MyIndexOutOfException("数据超出了范围") { ErrorCode = };
} } catch (MyIndexOutOfException ex) when (ex.ErrorCode!=) {
Console.WriteLine("出现了自定义错误");
} catch (MyIndexOutOfException ex) when (ex.ErrorCode == )
{
Console.WriteLine(ex.Message);
} catch (Exception ex)
{ throw;
}
}
}
上面例子中,自定义了一个异常处理,同时增加ErrorCode,以此来作为过滤条件,利用关键字When+条件来进行过滤。
总结
本篇文章介绍了异常处理错误的情况及机制,我们不仅可以输出代码好难过的一般错误代码,也可以输出我们自己定义的特殊错误情况。无论编程技术有多好,程序都必须能处理可能出现的任何错误。对不同的错误采取相应的应对措施,才是正确编码的其中一步。
不是井里没有水,而是你挖的不够深。不是成功来得慢,而是你努力的不够多。
欢迎大家扫描下方二维码,和我一起学习更多的C#知识

.NET----错误和异常处理机制的更多相关文章
- ThinkPHP5.0源码学习之注册错误和异常处理机制
在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...
- PHP 注册错误和异常处理机制
注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...
- 【Go语言】错误与异常处理机制
①error接口 Go语言中的error类型实际上是抽象了Error()方法的error接口 type error interface { Error() string } Go语言使用该接口进行标准 ...
- php5和php7的异常处理机制 ----thinkphp5 异常处理的分析
1.php异常和错误 在其他语言中,异常和错误是有区别的,但是PHP,遇见自身错误时,会触发一个错误,而不是跑出异常.并且,php大部分情况,都会触发错误,终止程序执行,在php5中,try catc ...
- php错误处理和php异常处理机制
php错误处理 当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误. 开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试 运行阶段:我们不要让程序输出任何一种错误报 ...
- Java异常处理机制 try-catch-finally 剖析
Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- Struts——(四)异常处理机制
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...
- Java之异常处理机制
来源:深入理解java异常处理机制 2.Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...
随机推荐
- C语言:正负数之间取模运算(转载)
如果 % 两边的操作数都为正数,则结果为正数或零:如果 % 两边的操作数都是负数,则结果为负数或零.C99 以前,并没有规定如果操作数中有一方为负数,模除的结果会是什么.C99 规定,如果 % 左边的 ...
- Mybatisの常见面试题
Mybatis -面试问题 最近准备系统的学一下Mybatis,之前只有粗略的看了下,选了十个常见的面试题 1. #{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换. Mybatis ...
- 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包
<Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...
- Modbus RTU 通信应用案例
如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...
- python基础认识(一)
这些日子以来,新闻铺天盖地的都是人工智能,那么借着这股潮流,python也随之火起来了,现在的python不仅仅可以进行人工智能领域的开发.还可以进行web.爬虫等领域的运用.因此,我认为作为一个紧跟 ...
- Android安卓书籍推荐《Android驱动开发与移植实战详解》下载
百度云下载地址:点我 Android凭借其开源性.优异的用户体验和极为方便的开发方式,赢得了广大用户和开发者的青睐,目前已经发展成为市场占有率很高的智能手机操作系统. <Android驱动开发与 ...
- 数据结构-双向链表(Python实现)
数据结构在编程世界中一直是非常重要的一环,不管是开发还是算法,哪怕是单纯为了面试,数据结构都是必修课,今天我们介绍链表中的一种--双向链表的代码实现. 好了,话不多说直接上代码. 双向链表 首先,我们 ...
- 使用反射机制将对象序列化Json
一 思路 获取对象的Class对象. 获取对象的属性数组, 迭代属性数据拼接属性名与属性值, 存入List. 将List转换为流库, 再将流库使用逗号分隔符转换为字符串, 去掉首尾的逗号 二 代码 p ...
- 洛谷P2055 [ZJOI2009]假期的宿舍 题解
题目链接: https://www.luogu.org/problemnew/show/P2055 分析: 这道题比较简单,二分图的练习题(当然最大流同理). 易得我们可以将人放在一侧,床放在一侧. ...
- C#3.0新增功能07 查询表达式
连载目录 [已更新最新开发文章,点击查看详细] 查询是什么及其作用是什么 查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织. 查询与它生成的结果不同. 通常情 ...