一个让人遗忘的角落—Exception(二)

简介: 在上一篇中"一个被人遗忘的角落--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处理异常呢?因为我从事的是Web开发,所以我只跟大家讨论Web的解决方案,Win的解决方式,还希望同大家一起探讨。

在上一篇中"一个被人遗忘的角落--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处理异常呢?因为我从事的是Web开发,所以我只跟大家讨论Web的解决方案,Win的解决方式,还希望同大家一起探讨。

上一章中我们了解了异常发生的原因,同时也说了不存在没有bug的程序,任何网站都会遇到各种各样的问题,无论是大网站还是小网站都会存在,但大公司和小公司对待异常的态度全然不同,一个是主动出击,一个是守株待兔,我们是好的开发者,我们不能坐以待毙,我们必须主动出击。好了,废话少说,切入主题。

现在网站一般都采用多层开发,多层开发的时候,我们应该在哪里处理异常、在抛出异常呢?微软的意见是类库的开发人员尽量不要处理异常,类库的编写应该按照正常的逻辑去编写,当然也有例外,注意事项可以参见"设计异常解决方案的几点注意事项 ",好的,按照规范,我们应该尽量在高层进行捕捉和处理,那我们该怎么捕捉,捕捉后怎么处理,捕捉哪些异常呢?虽然微软提供了很多系统异常,但是这些异常只是负责抛出相关的信息,并没有为记录下来,或者出现高级异常的时候,及时通知我们,这样的做法还是守株待兔,我们还是应该主动的对其进行处理。好在微软让我们可以自由的创建自定义的Exception,最好是设定一个自定义Exception基类,让你的其他自定义Exception都继承这个类,以便今后更好的扩展。抛出异常其实是性能消耗很大的操作,但是Richer教父说过,抛出异常的性能和你程序的稳定性相比,就变得非常渺小了。所以我们还是偏向于稳定性。因为处理异常的性能消耗,只是在异常发生时才产生,所以性能方面的问题,我们可以忽略了。(或许这话比较拗口,但相比系统的性能,我更趋向于系统的稳定)

   

如何创建一个自定义的Exception

不得不说微软考虑的太周到了,要创建一个自定义的Exception是非常简单的。打开VS,创建一个项目,然后添加一个类,在namespace范围内,输入Exception,然后2TabVS就自定帮您创建一个自定义的Exception了。Exception的相关属性和方法,可以参见MSDN。不过自动创建的Exception都是继承System.Exception的,按照微软当初的设想,自定义的异常应该继承System.ApplicationException (可笑的是,微软自己都没有遵守这个约定)。我们设定这个作为我们的Exception基类 MyBaseException

代码片断:

[global::System.Serializable]

public class MyBaseException : ApplicationException

{

public MyBaseException() { }

public MyBaseException(string message) : base(message) { }

public MyBaseException(string message, Exception inner) : base(message, inner) { }

protected MyBaseException(

System.Runtime.Serialization.SerializationInfo info,

System.Runtime.Serialization.StreamingContext context)

: base(info, context) { }

}

这就是一个标准的自定义Exception了,至于其它的自定义Exception,应该根据你的项目来进行相关的定义。

在进行其他定义之前,我们先来想想,我们捕捉这些Exception之后我们需要做些什么?我们需要知道异常发生的各种信息,所以我们需要LogLog能方便的让我们查阅发生的异常及Log的异常信息。Log有很多方式,大概的有以下几种:

文本记录

数据库记录

系统事件记录(Trace

第三方组件(Log4Net

这几种方式各有利弊,可以根据项目的需求进行选择,当然你也可以几种方式合用,比如我们默认的是文本记录方式,但是在创建Log时发生了System.IOException,我们就必须选择其他的方式进行Log

Log方式

便捷性

查阅性

安全性

结合性

文本记录

方便

一般

数据库记录

一般

方便

一般

系统事件记录

复杂

复杂

一般

第三方组件

复杂

一般

一般

我列举了几种方式的利弊,大家可以有条件的选择。如果你的项目中已经使用第三方组件记录方式,那我建议您使用它。在我后面的解决方案中,我会利用前2种比较常见的方式相结合。

Log的目的是为我们开发者提供发生异常的时间、地点、人物、原因,所以我们必须尽可能的详细地记录,根据一个Exception获取信息的方法:

Data

Source

Dates and Times

DateTime.Now

Source of Exception

Exception.Source

Type of Exception

Object.GetType

Exception Message

Exception.Message

Current Method

Reflection.MethodInfo.GetCurrentMethod

Machine Name

Environment.MachineName or Dns.GetHostName

CurrentIP

Dns.GetHostByName("host").AddressList[0].Address

Call Stack

Exception.StackTrace or Environment.StackTrace

OS Information

Environment.OSVersion

Applcation Domain

AppDomain.FriendlyName

Current Assembly

Reflection.Assembly.GetExecutingAssembly

Root Error Cause

Exception.GetBaseException

Chained Exception

Exception.InnerException

Assembly Version

Included in AssemblyName.FullName

Thread ID

AppDomain.GetCurrentThreadId

Thread User

Threading.Thread.CurrentPrincipal

我们可以根据上面的表格,构建我们自己所需要的Log信息。为了便捷的管理,我们应该采用同一格式,进行Log。这里贴一个我写的信息格式,以供参考:

public static class ExceptionLogFormatHelper

{

public static string ExceptionLogFormatter(Exception ex)

{

StringBuilder sbLog = new StringBuilder("\r\n------------------------------------\r\n");

Exception ochainException = ex;

var currentExceptionIndex = 1;

while (ochainException != null)

{

   

sbLog.Append("\r\nException " + currentExceptionIndex + " )")

.Append("\r\nException Type:" + ochainException.GetType().FullName)

.Append("\r\nException Source:" + ochainException.Source)

.Append("\r\nException Message:" + ochainException.Message)

.Append("\r\nException Date:" + DateTime.Now)

.Append("\r\nEnvironment Stack:" + System.Environment.StackTrace);

ochainException = ochainException.InnerException;

currentExceptionIndex++;

}

sbLog.Append("\r\n------------------------------------\r\n");

return sbLog.ToString();

}

}

你也可以根据你自己想要的信息构建这么一个方法。

这一篇废话多了点,不过还是有必要了解下。还介绍了自定义异常的创建,日志方式的对比,在下一篇,我将介绍通知、异常处理流程和定义自己的一个MyBaseException

相关文章
|
Java Maven 数据安全/隐私保护
Maven - 发布JAR包到Maven远程中央仓库(五)
Maven - 发布JAR包到Maven远程中央仓库(五)
1148 0
Maven - 发布JAR包到Maven远程中央仓库(五)
|
7月前
|
机器学习/深度学习 人工智能 DataWorks
《AI牵手DataWorks,实时数据分析“一路狂飙”》
在大数据时代,数据是企业的生命线,实时数据分析能力至关重要。阿里巴巴的DataWorks作为强大的数据中台工具,结合人工智能(AI)技术,彻底改写了实时数据分析格局。传统方法面临数据量增长、复杂结构及缺乏自适应能力等挑战,而AI通过机器学习和深度学习算法,实现了智能预警、个性化推荐和实时风险评估等应用场景,显著提升了数据分析的速度和精度。成功案例显示,某互联网公司引入AI赋能的DataWorks后,用户活跃度提升30%,购买转化率提高20%。未来,AI与新兴技术的融合将进一步推动实时数据分析的发展。
301 6
|
8月前
|
存储 机器学习/深度学习 人工智能
飞天企业版异构算力调度平台获评2024年度技术卓越奖
飞天企业版异构算力调度平台凭借在政企云平台兼容性、稳定性和性能方面的出色表现,获评2024年度技术卓越奖。
344 14
|
8月前
|
人工智能 监控 数据安全/隐私保护
AI视频监控在大型商场的隐私保护技术
为保障隐私合规,商场采取数据加密与匿名化处理,防止敏感信息泄露;同时通过透明性声明和合法授权,确保顾客知情并同意监控措施。技术手段包括加密算法保护、去除身份识别细节,并在显眼位置张贴隐私政策,采用电子屏幕、语音提示或二维码获取顾客同意,确保监控行为合法合规。
257 0
|
9月前
|
定位技术
探秘站点检测访问中代理 IP 的实用技巧
随着互联网发展,使用代理IP的需求增加。站点检测代理IP的方法包括:1. IP地址黑名单;2. HTTP头部检查(如X-Forwarded-For);3. 行为分析;4. 地理位置检测;5. CAPTCHA验证;6. 连接特征分析。这些技术帮助网站判断访问是否来自代理。
240 6
带你读《实分析(原书第4版)》之三:Lebesgue测度
本书是一部实分析方面的经典教材,主要分三部分,第壹部分为经典的实变函数论和经典的巴拿赫空间理论;第二部分为抽象空间理论,主要介绍分析中有用的拓扑空间以及近代巴拿赫空间理论;第三部分为一般的测度和积分论,即在第二部分理论基础上将经典的测度、积分论推广到一般情形。
|
人工智能 算法 安全
AI伦理:探索智能时代的道德边界
【9月更文挑战第10天】随着AI技术的发展,我们步入了智能时代,AI的应用为社会带来便利的同时,也引发了伦理道德的讨论。本文探讨了数据隐私、算法偏见及系统透明度等伦理问题,并提出制定法规、行业自律、伦理审查及跨学科合作等策略,旨在确保AI技术的健康发展,构建智能、公平、安全的未来。通过共同努力,我们能在技术进步与道德边界间找到平衡点,推动社会持续进步。
|
NoSQL 关系型数据库 API
内部系统开发原来可以这么爽!5款低代码平台推荐
这里码匠为您推荐 5 款海外目前流行的内部系统低代码平台并进行评测,为您在企业低代码平台的选择上助一臂之力。
1710 0
内部系统开发原来可以这么爽!5款低代码平台推荐
|
云安全 机器学习/深度学习 人工智能
六个优秀漏洞管理工具
这些年来,不仅漏洞管理发生了相当大的变化,企业安全团队发现并不断修补的系统也发生了变化。如今,有系统内部部署、物联网设备、公有和私有云,以及更多的定制应用程序。漏洞管理系统不再只关注网络和私有托管应用程序。现在,他们必须评估所有这些系统,找出漏洞,并帮助企业安全团队做出更好的补救决策。
2237 1
|
机器学习/深度学习 搜索推荐 算法
【机器学习中的矩阵分解】LU分解、QR分解、SVD分解
Singular Value Decomposition。 SVD是一种基于矩阵分解的,提取信息的强大工具,能够发现数据中的潜在模式。应用领域比如:
665 0
【机器学习中的矩阵分解】LU分解、QR分解、SVD分解

热门文章

最新文章