在开发过程中,经常遇到各种各样的小问题,很多是由于基础不牢固,没有经常总结导致的。遇到重复的问题可能可根据以往经验处理,但是对问题本身引发的原因进行深入的了解。工作很多年,但是c#基础像一层冰一样,可能还停留在应届生的阶段。

  这里写一些总结帖子,但不会持续写,有时间或者遇到问题时再写,时间比较紧,很多是摘抄网络上的。

  目录(仅记录下):

  c#基础之异常处理

  c#基础之IO操作

  c#基础之对象

  c#基础之特性

c#基础之异常处理 

一、简介

  异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。

  因此处理这种错误,就称为异常处理。

  引起异常的原因,一般是使用者不正当操作,开发者没有按规范的处理数据、使用技术不当导致的,极少情况是由于.NET内部错误引起的。

二、使用

   C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
   1、try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
   2、catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
   3、finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。
   4、throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

三、C#中的异常类

 C# 异常是使用类来表示的。

  C# 中的异常类主要是直接或间接地派生于System.Exception.

(1).由System.SystemException派生的异常类型:

  System.AccessViolationException 在试图读写受保护内存时引发的异常。

  System.ArgumentException 在向方法提供的其中一个参数无效时引发的异常。

  System.Collections.Generic.KeyNotFoundException 指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常。

  System.IndexOutOfRangeException 访问数组时,因元素索引超出数组边界而引发的异常。

  System.InvalidCastException 因无效类型转换或显示转换引发的异常。

  System.InvalidOperationException 当方法调用对于对象的当前状态无效时引发的异常。

  System.InvalidProgramException 当程序包含无效Microsoft中间语言(MSIL)或元数据时引发的异常,这通常表示生成程序的编译器中有bug。

  System.IO.IOException 发生I/O错误时引发的异常。

  System.NotImplementedException 在无法实现请求的方法或操作时引发的异常。

  System.NullReferenceException 尝试对空对象引用进行操作时引发的异常。

  System.OutOfMemoryException 没有足够的内存继续执行程序时引发的异常。

  System.StackOverflowException 挂起的方法调用过多而导致执行堆栈溢出时引发的异常。

(2).由System.ArgumentException派生的异常类型:

  System.ArgumentNullException 当将空引用传递给不接受它作为有效参数的方法时引发的异常。

  System.ArgumentOutOfRangeException 当参数值超出调用的方法所定义的允许取值范围时引发的异常。

(3).由System.ArithmeticException派生的异常类型:

  System.DivideByZeroException 试图用零除整数值或十进制数值时引发的异常。

  System.NotFiniteNumberException 当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。

  System.OverflowException 在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常。

(4).由System.IOException派生的异常类型:

  System.IO.DirectoryNotFoundException 当找不到文件或目录的一部分时所引发的异常。

  System.IO.DriveNotFoundException 当尝试访问的驱动器或共享不可用时引发的异常。

  System.IO.EndOfStreamException 读操作试图超出流的末尾时引发的异常。

  System.IO.FileLoadException 当找到托管程序却不能加载它时引发的异常。

  System.IO.FileNotFoundException 试图访问磁盘上不存在的文件失败时引发的异常。

  System.IO.PathTooLongException 当路径名或文件名超过系统定义的最大长度时引发的异常。

(5).其他常用异常类型:

  ArrayTypeMismatchException 试图在数组中存储错误类型的对象。

  BadImageFormatException 图形的格式错误。

  DivideByZeroException 除零异常。

  DllNotFoundException 找不到引用的dll。

  FormatException 参数格式错误。

  MethodAccessException 试图访问私有或者受保护的方法。

  MissingMemberException 访问一个无效版本的dll。

  NotSupportedException 调用的方法在类中没有实现。

  PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误。

四、深入理解

  示例:

try
{
//一些处理
}
catch (Exception e)
{
//一些处理
throw e; //CLR认为这里是异常的起始点
} try
{
//一些处理
}
catch (Exception e)
{
//一些处理
throw; //CLR不会重新设置异常的起始点
}

  设置捕获异常后,再次抛出异常。这种情况很少遇到,一般情况下不会这么处理,但是以上2种方式的处理方式差别很大。

  即当我们抛出一个异常时, CLR会重新设置一个异常起始点。 CLR只记录最近一次异常抛出的位置。

  throw e;  再次引发当前异常,导致CLR重新设置该异常的起始点。

  throw;   引发当前位于计算堆栈上的异常对象,但不会导致CLR重新设置异常的起始点。

   C#中使用throw和throw ex抛出异常,但二者是有区别的。

  在C#中推荐使用throw;来抛出异常;throw ex;会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。throw e重新抛出异常,并非转发原来的异常,而会更改包括StackTrace在内的许多异常内部信息;对于调用连很深情况,性能损耗超出想象。

五、Stacktrace(堆栈跟踪)

类:

网上的代码,记录下以备用

string BuildStackTraceMessage(StackTrace stackTrace)
{
if (stackTrace != null)
{
var frameList = stackTrace.GetFrames();
var realFrameList = frameList.Where(i => i.GetMethod().DeclaringType != this.GetType() && i.GetFileLineNumber() > );
if (realFrameList.Any())
{
StringBuilder builder = new StringBuilder();
realFrameList = realFrameList.Reverse();
var lastFrame = realFrameList.Last();
builder.AppendFormat("源文件:{0}", lastFrame.GetFileName()).AppendLine();
builder.AppendFormat("行号:{0}", lastFrame.GetFileLineNumber()).AppendLine();
builder.AppendFormat("方法名:{0}", lastFrame.GetMethod().ToString()).AppendLine();
builder.AppendLine("堆栈跟踪:");
builder.AppendLine("================================================================="); MethodBase method;
foreach (var frame in realFrameList)
{
method = frame.GetMethod();
builder.AppendFormat("> {0} 类下的第{1}行 {2} 方法", method.DeclaringType.ToString(), frame.GetFileLineNumber(), method.ToString()).AppendLine();
}
builder.AppendLine("=================================================================");
return builder.ToString();
}
}
return "没有堆栈信息";
}

C# 获取当前方法的名称空间、类名和方法名称

1.(new StackTrace()).GetFrame(1) // 0为本身的方法;1为调用方法
2.(new StackTrace()).GetFrame(1).GetMethod().Name; // 方法名
3.(new StackTrace()).GetFrame(1).GetMethod().ReflectedType.Name; // 类名

public string GetMethodInfo()
{
string str = ""; //取得当前方法命名空间
str += "命名空间名:" + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace + "\n"; //取得当前方法类全名 包括命名空间
str += "类名:" + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "\n"; //取得当前方法名
str += "方法名:" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\n"; str += "\n"; //父方法
System.Diagnostics.StackTrace ss = new System.Diagnostics.StackTrace(true);
System.Reflection.MethodBase mb = ss.GetFrame().GetMethod(); //取得父方法命名空间
str += mb.DeclaringType.Namespace + "\n"; //取得父方法类名
str += mb.DeclaringType.Name + "\n"; //取得父方法类全名
str += mb.DeclaringType.FullName + "\n"; //取得父方法名
str += mb.Name + "\n"; return str;
}

相关文章:

使用StackTrace堆栈跟踪记录详细日志(可获取行号)

C# 获取当前方法的名称空间、类名和方法名称

整理的内容来自:

http://www.cnblogs.com/hgmyz/p/6984206.html

http://blog.csdn.net/jiankunking/article/details/49463991

http://blog.csdn.net/jiankunking/article/details/43936729

http://blog.csdn.net/jiankunking/article/details/49443493

c#基础之异常处理的更多相关文章

  1. Python 基础之 异常处理

    python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理?  先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...

  2. c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL

    c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...

  3. Python之路第八天,基础(10)-异常处理

    异常处理 1. 异常基础 python3 try: pass except Exception as ex: pass while True: num1 = input('num1:') num2 = ...

  4. Python开发基础-Day23try异常处理、socket套接字基础1

    异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...

  5. windows内核基础与异常处理

    前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...

  6. python基础之异常处理

    Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...

  7. Python基础、异常处理

    一.概述 错误与异常概念 异常也是对象, 基于Exception类.内置异常 异常处理.流程 try/except/else  处理python或你触发的异常 try/fianlly   不管有没有异 ...

  8. 黑马程序员——JAVA基础之异常处理机制

    ------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...

  9. 一天一个Java基础——通过异常处理错误

    <Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...

随机推荐

  1. Trap 冷启动与热启动告警

    冷启动: 设备断电重启. 热启动: snmp agent 从未使能到使能的操作会产生此告警.

  2. Nginx记录-nginx 负载均衡5种配置方式(转载)

    nginx 负载均衡5种配置方式 1.轮询(默认)   每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.  2.weight 指定轮询几率,weight和访问比率成 ...

  3. JVM 虚拟机笔记

    GC算法 标记-清除算法复制算法标记-整理算法分代收集 新生代--[15次GC]-->老年代新生代:复制算法老年代: 标记-清除算法或标记-整理算法 GC策略采用的何种算法引用计数算法根搜索算法 ...

  4. ruby select 方法,可用于先查询结果后,再次用条件限制

    1. 用于条件过滤 @works=DworkPro.all.order(:work_type) @work_pro=@works.select{ |x| x.job_type == 7} 2. sel ...

  5. zepto.min.js

    /* Zepto v1.1.3 - zepto event ajax form ie - zeptojs.com/license */var Zepto=function(){function L(t ...

  6. hdu 6441 (费马大定理+勾股数 数学)

    题意是给定 n 和 a,问是否存在正整数 b,c 满足:a^n + b^n == c^n.输出 b  c,若不存在满足条件的 b,c,输出 -1 -1. 当 n > 2 时,由费马大定理,不存在 ...

  7. Entity Framework 学习总结之十一:POCO

    POCO Entity Framework 4.0 为实体提供了简单传统 CLR 对象( Plain Old CLR Object / POCO )支持.实体对象可以独立于 EF 存在,由此 EF 更 ...

  8. impala系列: 基本命令和jdbc连接

    --======================= 使用impala-shell 登录 --======================= impala-shell --auth_creds_ok_i ...

  9. oracle查看表空间数据文件使用情况

    -- 查看表空间数据文件使用情况 select a.*, round(a.usedgb/a.maxgb*100) || '%' usedPer from ( select t.TABLESPACE_N ...

  10. HTTP 返回状态码

    一.HTTP 超文本传输协议 HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议. 一个HTTP "客户端"是一个应用程 ...