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

    Tomcat的下载安装配置什么的,百度一大把.现在介绍一下Tomcat的文件夹目录结构. 浏览器访问127.0.0.1:8080 出现Tomcat页面即表示安装成功. 这个就是Tomcat的目录了 b ...

  2. Linux记录-shell获取hdfs used使用

    #!/bin/bash export JAVA_HOME=/app/jdk/jdk1.8.0_92 export HADOOP_HOME=/app/hadoop export HADOOP_CONF_ ...

  3. Ado.NET基础必备

    一.SqlConnection对象 第一次需要连接数据库时要和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了(默认使用了连接池技术). SqlConnec ...

  4. MysqL_select for update锁详解

    先来举一个在某些应用场景下会出现数据不一致的例子,当然存储引擎是InnoDB(至于为什么,后面再告诉你). 电商平台常见的下单场景: 一般商品表(goods)有基本的四个字段,id(主键),goods ...

  5. python中的顺序表

    Python中的list和tuple两种类型采用了顺序表的实现技术,tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现 ...

  6. java操作数据库:分页查询

    直接上.... 还是用之前的goods表,增加了一些数据 1.实体类Goods // 封装数据 public class Goods { private int gid; private String ...

  7. IScroll基本用法

    一.为了防止手机上卡顿:1.从新设置一下焦点.2. <script>try { window.PointerEvent = undefined; } catch (e) { } </ ...

  8. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  9. Lua Doc生成工具

    Luadoc http://keplerproject.github.io/luadoc/ Overview LuaDoc is a documentation generator tool for ...

  10. Javaweb学习笔记——(十七)——————JDBC的原理、四大核心类、四大参数、预编译、Dao模式、批处理、大数据、时间类型的转换

    JDBC入门 *导入jar包:驱动 *加载驱动类:Class.forName("类名"); *给出url.username.password,其中url背下来 *使用DriverM ...