在开发过程中,经常遇到各种各样的小问题,很多是由于基础不牢固,没有经常总结导致的。遇到重复的问题可能可根据以往经验处理,但是对问题本身引发的原因进行深入的了解。工作很多年,但是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. hibernate HQL查询参数设置

    Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: Prepa ...

  2. java-map复合类型(HashMap-TreeMap)常用操作例子(适合初学者)

    package com.net.xinfang.reflect; import java.util.ArrayList; import java.util.HashMap; import java.u ...

  3. 阿里面试题:为什么Map桶中个数超过8才转为红黑树

    (为什么一个是8一个是6:防止频繁来回转换小消耗性能) 这是笔者面试阿里时,被问及的一个问题,应该不少人看到这个问题都会一面懵逼.因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什 ...

  4. openstack ovs实现vlan组网

    本文是配置文档,非说明文档,只讲配置,不讲原理. controller节点: 网卡信息:ens160 外网网卡 : ens192 数据网卡 /etc/neutron/plugins/ml2/ml2_c ...

  5. Set实现数组去重

    ES6 提供了新的数据结构 Set 它类似于数组,但是成员的值都是唯一的,没有重复的值 (set本身是一个构造函数,用来生成 Set 数据结构)   使用Set实现数组去重要简单很多.   第一种数组 ...

  6. 4.mysql(slow_log/generic_log/audit)

    一.慢查询日志进阶 <1>相关参数 1.slow_query_log #是否开启慢查询日志 2.slow_query_log_file #慢查询日志文件名,在my.cnf我们已经定义为sl ...

  7. 常用.net反编译替换正则表达式

    .set_([^\(]*) .$ = ------------------ .get_([^\(]*)\(\) .$ ------------------ .get_Item\(([a-z|-]+)\ ...

  8. Pre-shared key

    Pre-shared key https://en.wikipedia.org/wiki/Pre-shared_key In cryptography, a pre-shared key (PSK) ...

  9. springboot项目怎么部署到外部tomcat

    spring-boot项目中,默认提供内嵌的tomcat,所以打包直接生成jar包,用Java -jar命令就可以启动. 但是也有一定的需求,会使用外部tomcat来部署项目.下面来看: 1.新建项目 ...

  10. luogu P4491 [HAOI2018]染色

    传送门 这一类题都要考虑推式子 首先推出题目要求的式子,枚举正好有\(s\)个颜色的种类(范围\([0,p=min(\lfloor\frac{n}{s}\rfloor,m)]\)),然后对于后面的颜色 ...