C# 错误和异常

Try,catch和finally语句组成

异常层次结构

部分异常属性:
Message
类型:string
描述:含有解释异常原因的消息(只读)
StackTrace
类型:string
描述:含有描述异常发生在何处的消息
InnerExcption
类型:Exception
描述:如果当前异常是由另一个异常引起的,这个属性包含前一个异常的引用
HelpLink
类型:string
描述:为异常原因信息提供URN或URL
Source
类型:string
描述:如果没有应用程序定义的异常设定,那么这个属性含有异常所在的程序集的名称
Date
类型:IDdictionary
描述:其他异常信息的键值对的集合
Targetsite
引发当前异常的方法
finally块
如果try块内部没有异常发生,那么在try块结尾,控制流跳过任何catch子句并到finally块
如果在try块内内部发生了异常,那么catch子句段中无论哪一个被执行,接下来就是finally块执行
即使try块中有return语句或在catch块抛出一个异常,
finally块也总是在返回到调用代码之前执行。
异常的进一步搜索
如果一个没有被try语句保护的代码中产生异常,或者try语句没有匹配到异常处理程序时。系统将会进一步寻找匹配的处理代码。
为此它为按顺序搜索调用栈,以看看是否存在带匹配的处理程序的封装try块。
比如:Method2被从Method1的try块内部调用,现在异常发生在Method2类的try块内部。
如果Method2中能处理异常,程序会继续执行
没有,系统会随着调用栈找到Method1,寻找合适的处理程序
如果Method1有适当的catch子句,那么
回到栈顶,即回到Method2
执行Method2的finally块,并把Method2弹出栈
执行Method1的catch子句和finally块
如果Method1也没有,则继续搜索

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
class MyClass
{
void B()
{
int x = , y = ;
try
{
x /= y;
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("catch clause B()");
}
finally
{
Console.WriteLine("finally clause in B()");
}
}
public void A()
{
try
{
B();
}
catch(NullReferenceException)
{
Console.WriteLine("catch clause in A()");
}
finally
{
Console.WriteLine("finally clause in A()");
}
}
}
static void Main(string[] args)
{
MyClass MCls = new MyClass();
try
{
MCls.A();
}
catch(DivideByZeroException e)
{
Console.WriteLine("catch clause in Main()");
}
finally
{
Console.WriteLine("finally clause in Main()");
}
Console.WriteLine("After try statement in Main.");
Console.WriteLine(" -- Keep running.");
}
}
}
找到catch(DivideByZeroException e)后,不会立即执行,而是
1 回到栈顶执行B的finally
2 B弹出,执行A的finally
3 执行自己
4 执行main剩下语句

显式抛出异常
可以使用throw语句使代码显式引发一个异常
throw ExceptionObject

不带异常对象的抛出

throw几种方式的区别
throw;可追溯到原始异常点,获取所有异常(范围粒度较大)
throw ex;会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。
throw new Exception("errstr",ex);经过对异常重新包装,会保留原始异常点信息。
异常参数使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class MyClass
{
public static int Parse(string textDigit)
{
string[] digitTexts =
{
"zero","one","two","three","four","five","six","seven","eight","nine"
};
int result = Array.IndexOf(digitTexts, textDigit.ToLower());
Console.WriteLine(result);
if (result < )
{
throw new ArgumentException("the argument did not represent a digit", "textDigit");
}
return result;
}
static void Main(string[] args)
{
int a=Parse("one");
Console.WriteLine(a);
}
}
}
其中:throw new ArgumentException("the argument did not represent a digit", "textDigit");
- 未经处理的异常: System.ArgumentException: the argument did not represent a digit
参数名: textDigit
异常类型的区别
ArgumentNullException和NullReferenceExcetion
前者在错误传递了null时引发,null是无效参数特例,如果不为null,无效参数引发的异常是ArgumentException或ArgumentOutOfRangeException
NullReferenceExcetion一般只有在底层“运行时”解引用null值(想调用对象成员,但发现对象的值为null),不要自己引发NullReferenceExcetion,相反还需要检查引用的参数变量是否为空,并在null的前提下引发ArgumentNullException
引发异常时需要注意的地方


异常处理规范
只捕捉能处理的异常
不要隐藏你不能完全处理的异常
尽可能少的使用System.Exception和常规catch块,处理某些异常System.Exception的最佳方式是不对它们进行处理,或者尽快以正常方式关闭应用程序,这些异常包括:
System.OutOfMemoryException和System.StackOverflowException等
避免在调用栈较低的位置报告或记录异常
在catch块中使用throw,而不是throw<异常对象>



自定义异常
自定义异常唯一的要求是必须从System.Exception或者它的某个子类派生
创建自定义异常类应严格遵循几个原则
1. 声明可序列化(用于进行系列化,当然如果你不需要序列化。那么可以不声明为可序列化的)
2. 添加一个默认的构造函数
3. 添加包含message的构造函数
4. 添加一个包含message,及内部异常类型参数的构造函数
5. 添加一个序列化信息相关参数的构造函数.
public class DatabaseException : System.Exception
{
///<summary>
///默认构造函数
/// </summary>
public DatabaseException() { }
public DatabaseException(string message) : base(message) { }
public DatabaseException(string message,Exception inner) : base(message, inner) { }
}


C# 错误和异常的更多相关文章
- python的错误和异常
python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...
- Python错误和异常学习
一:错误解释 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 代码运行前的语法或者逻辑错误,语法错误在执行前修改,逻辑错误无法修改 二:异常 执行过程 ...
- PHP 错误与异常 笔记与总结(10)错误处理器测试
关联文件:myErrorHandler.php (上一篇) 先测试通知级别的错误的自定义处理: testErrorHandler.php <?php require_once 'myErrorH ...
- Go语言项目的错误和异常管理 via 达达
Go语言项目的错误和异常管理 最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享. 首先我 ...
- Python学习笔记七-错误和异常
程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的. 7.1错误和异常 1.错误 从软件方面来看,错误分为语法错误和逻辑错误两种.这两种错误都将导致程序无法正常进行下去,当Pyt ...
- WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)
WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...
- php错误及异常捕捉
原文:php错误及异常捕捉 在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的. 所以引用以下几中函数. a) set_error_handler 一般用于捕捉 E_NOTI ...
- PHP错误与异常
请一定要注意,没有特殊说明:本例 PHP Version < 7 说起PHP异常处理,大家首先会想到try-catch,那好,我们先看一段程序吧:有一个test.php文件,有一段简单的PHP程 ...
- python 常见错误和异常 函数 正则表达式及多线程编程
生成随机密码#!/usr/bin/env python import stringfrom random import choice def gen_pass(num=9): all_chs = st ...
- PHP的日志记录-错误与异常记录
PHP的日志记录-错误与异常记录 提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是 ...
随机推荐
- Marr的视觉计算理论
Marr的视觉计算理论立足于计算机科学,系统地概括了心理物理学.神经生理学.临床神经病理学等方面已取得的所有重要成果,是迄今为止最为系统的视觉理论.Marr 的视觉计算理论虽然在细节甚 ...
- ef增删改查
[C#]Entity Framework 增删改查和事务操作 1.增加对象 DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长 ...
- 【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解
原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量—— ...
- 【01】循序渐进学 docker:到底是啥
写在前面的话 首先说一下,我本身是做运维的,4 年工作,多家公司.所以可能接下来谈到的更多的是一些在工作过程中积累的个人看法.且有些并不具备普遍性,有不合适的地方,全当我在吹牛逼就行. 一开始我们得谈 ...
- WPF DataGrid CheckBox 多选 反选 全选
效果图 实现此效果的必要关键是 Style+DataTemplate 关键代码: <Window.Resources> <DataTemplate x:Key="Check ...
- 网页的js源文件被加密解决方案
Firefox和Chrome都具有这个功能,而且位置几乎一致
- css清除浮动的8种方法以及优缺点
浮动会使当前标签产生上浮的效果,同时会影响到前后的标签.父级标签的位置及width height 属性.而且同样的代码,在各种浏览器中效果可能不同,这样让清除浮动更难了.清除浮动引起的问题有很多的方法 ...
- 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...
- 没有上司的舞会 树形dp
题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...
- js 自定义属性
html标签中有没有什么自带的属性可以存储成绩的----没有 本身html标签没有这个属性,自己(程序员)添加的,----自定义属性---为了存储一些数据 在html标签中添加的自定义属性,如果 ...