一、MSDN描述

Exception 类: 表示在应用程序执行期间发生的错误

命名空间 : System

程序集:   mscorlib.dll

继承关系:

常用属性(含字段)和方法:

1. 属性
Message         描述当前异常的消息
StackTrace     获取调用堆栈上直接帧的字符串表示形式(说白了就是导致异常的函数调用栈信息)
Source           获取导致异常的应用程序或对象名称
TargetSite      获取引发异常的方法

其中 StackTrace 属性最有用

2.方法

ToString        返回当前异常的字符串表示形式(重写Object.ToString())

备注:

1.  Exception 的常见用法 try-catch 块(用try包裹待执行的代码,用catch来捕捉待执行代码出现的异常)

2.  try-catch-finally 块,即使异常发生 finally 也会进,finally中放清理资源的代码

3.  using语句会自动生成try-finally 的IL

二、一些建议

1.不要返回错误码(用返回错误码表示异常是Win32时期的特色,在.NET时代这是不允许的)

2.要通过抛出异常的方式来报告失败

3.不要轻易吃掉异常,如果是异常就应该抛出

4.不要把异常作为业务逻辑分支

try
{
逻辑A
}
catch
{
逻辑B
} 后续逻辑

5. 不要让公有成员根据某个选项来决定是否抛出异常

public Type GetType(string name,bool throwOnError); // 不好的设计

像上面的API设计通常反映出框架设计者的无力做出决定。一个方法要么成功,要么失败,而失败了就应该抛出异常。框架设计者未能做出决定,这迫使API调用者来决定,但由于调用者并不了解API的实现细节,因此他们更难做出正确的决定

6.异常的抛出应该选择最具有描述性的一个(如系统没有该异常,考虑自定义一个异常)

如try 语句块的功能是解析某参数,那么catch 块就应该优先用 ArgumentException (参数异常),最后再用 Exception 来捕获其他异常

try{}
catch(ArgumentException ex){}
catch(Exception ex){}

7. 用 Try-Parse 模式

如 DateTime.TryParse 这是综合了性能和异常处理的好东西,比直接 DateTime.Parse 好

三、使用log4net记录异常信息

官网:http://logging.apache.org/log4net/

1. 配置 log4net.config

<?xml version="1.0" encoding="utf-8"?>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="Text" />
</root>
<appender name="Text" type="log4net.Appender.RollingFileAppender">
<param name="File" value="D:\log4netDemo\log4netDemoApp.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="1000" />
<param name="MaximumFileSize" value="1024KB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>

修改上面的 <param name="File" value="D:\log4netDemo\log4netDemoApp.log" /> 改为你想要的日志存放路径

注意这个 log4net.config 应该编译输入到程序目录(如:bin\Debug)

2. 在主程序启动类中写如下代码

private const string c_logConfig = "log4net.config";
private log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Program)); static void Main(string[] args)
{
using (Stream stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, c_logConfig)))
{
XmlConfigurator.Configure(stream);
}
。。。 }

3. 使用

_log.Info("Start");
_log.Error("捕捉到异常{0}", ex);

更多log4net方法,查看API文档

四、全局异常捕获

AppDomain.CurrentDomain.UnhandledException

static void Mian()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception error = (Exception)e.ExceptionObject;
_log.Error("MyHandler caught : " + error.Message);
}

WinForm、WPF、ASP.NET 均有全局异常捕获

五、多线程中的异常捕获

错误的捕获方式:

 static void ThreadException1()
{
var t = new Thread(() => { throw new Exception("线程抛出异常"); });
try
{
t.Start();
}
catch (Exception ex)
{
// 这样捕获不到线程异常
_log.Error("捕获到线程异常 {0}", ex);
}
}

正确的捕获方式:

 static void ThreadException2()
{
var t = new Thread(() =>
{
try
{
throw new Exception("线程抛出异常");
}
catch (Exception ex)
{
_log.Error("捕获到线程异常 {0}", ex);
}
});
t.Start();
}

六、系统事件查看器

这是一个很有用的功能,估计还有不少同学不知道

右键计算机(我的电脑) ==> 管理 ==> 计算机管理

本文代码下载

类库探源——System.Exception的更多相关文章

  1. 类库探源——System.Delegate

    一.MSDN 描述 Delegate 类:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法.(是不是感觉很像C语言中的函数指针 :) ) 命名空间: System 程序集:   ...

  2. 类库探源——System.Configuration 配置信息处理

    按照MSDN描述 System.Configuration 命名空间 包含处理配置信息的类型 本篇文章主要两方面的内容 1. 如何使用ConfigurationManager 读取AppSetting ...

  3. 类库探源——System.Drawing.Bitmap

    一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System ...

  4. 类库探源——System.Drawing

    一.System.Drawing 命名空间简述 System.Drawing 命名空间提供访问 GDI+ 的基本功能,更高级的功能在 System.Drawing.Drawing2D,System.D ...

  5. 类库探源——System.Math 和 Random

    一.System.Math Math类:为三角函数.对数函数和其他通用数学函数提供常数和静态方法 命名空间: System 程序集 :   mscorlib.dll 继承关系: 常用属性: Math. ...

  6. 类库探源——System.ValueType

    一.MSDN描述 ValueType 类:提供值类型的基类 命名空间: System 程序集:   mscorlib.dll 继承关系: 值类型包括:字符.整数.浮点.布尔.枚举.结构(其实字符.整数 ...

  7. 类库探源——System.Environment

    Environment 类: 提供有关当前环境和平台的信息以及操作它们的方法.此类不能被继承. 命名空间: System 程序集:   mscorlib.dll 继承关系: 常用属性(字段)和方法: ...

  8. 类库探源——System.String

    一.MSDN描述 String 类: 表示文本,即一系列的 Unicode 字符 命名空间 : System 程序集 : mscorlib.dll 继承关系: 备注: 1. 字符串是 Unicode ...

  9. 类库探源——System.Type

    一.MSDN 描述 Type 类:表示类型声明:类类型.接口类型.数组类型.值类型.枚举类型.类型参数.泛型类型定义.以及开放或封闭构造的泛型类型. 命名空间: System 程序集:mscorlib ...

随机推荐

  1. AppScan修复漏洞:启用不安全的HTTP方法

    最近对于系统使用Appscan扫描出中危漏洞“启用不安全的HTTP方法,找了很多修复方法都不能达到效果. 漏洞截图: 漏洞描述: 危险级别   中危险 影响页面   整个WEB页面. 简短描述   管 ...

  2. Linux创建新用户以及useradd adduser的区别

    从阿里云那弄了个机子玩玩,系统用的是Ubuntu12.04.刚等上去时候是用root登录的,首先想到的就是创建一个用户. 使用 useradd myname 发现/home目录下没有myname的家目 ...

  3. 奇怪的Lisp和难懂的计算机程序的构造和解释

    最近用新买的 Kindle 看<黑客与画家>的Lisp部分,发现作者 Paul Graham 很推崇 Lisp 语言,并且认为其它语言都没有Lisp简洁“成熟”,并且举例证明其它语言都在往 ...

  4. UF2.0、O4、UFT、TA众明星背后的秘密

    UF2.0--经纪业务运营平台 O4--投资交易管理系统软件 UFT--证券极速交易系统软件 TA--登记过户系统 -- 说到恒生在业内的明星产品,太多了,小编一口气说不完,但小编只知其一,殊不知这些 ...

  5. Apache Commons 工具类介绍及简单使用

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  6. FZU2132 - LQX的作业(概率论)

    Problem Description LQX在做作业时遇到一个难题不会做,请你帮她计算一下:在N个独立地分布于0和1之间的随机变量排为非递减顺序之后,这些变量中第M个小于等于x的概率是多少? Inp ...

  7. 【JAVA - SSM】之MyBatis输出映射

    MyBatis中的输出映射有两种:resultType和resultMap. 1.resultType 使用resultType进行结果映射时,只有当查询结果中有至少一列的名称和resultType指 ...

  8. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  9. AFNetWorking源码详解(二)

    来源:Yuzeyang 链接:http://zeeyang.com/2016/03/15/AFNetWorking-two/ AFHTTPSessionManager继承于AFURLSessionMa ...

  10. Retrofit2源码分析(一)

    本文将顺着构建请求对象→构建请求接口→发起同步/异步请求的流程,分析retrofit2是如何实现的. 组成部分 Retrofit2源码主要分为以下几个部分: retrofit retrofit-ada ...