使用IsLine FrameWork开发ASP.NET程序之五—使用ExceptionProcessProvider异常处理框架(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

对异常的管理是由IsLine.ExceptionProcess.ExceptionProcessProvider命名空间完成的。

    系统日志和系统异常是分开记录的,ILFW将系统日志与异常分开处理,以提高系统灵活性和安全性。           ExceptionProcessProvider是应用程序需要交互的主要组件,它用来产生异常消息,产生的异常消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

    异常模块依附于IsLine.AppLog.AppLogProvider部分,同时异常模块设计时是作为一种特殊的系统日志来对待的,所以使用Exception模块首先要配置AppLog模块,具体方法参见Aicken的相关文章。

配置好日志模块后,需要引入上述命名空间,并在web.config中使用“add”标签添加一个Exception的指针:

    <add key="IsLine.ExceptionProcess.Configuration.RenderName" value="OracleUsingSPRender"/>

    这个指针的作用是告诉Exception模块使用的渲染器,渲染器的名字就是value,模块加载时,会自动加载IsLine.AppLog命名空间下的“渲染器初始化”模块,经过对渲染器的初始化后,才会加载具体的Exception对象。

    这个配置过程描述如下,假使我们需要把异常信息记入文本文件,后来发现异常很重要,要写入数据库予以保存,那么我们需要这样修改web.config文件。

    1.在<configSections></configSections>之间加入如下节点sectionGroup name为“FileRender “与”OracleUsingSPRender “的节点

    2.在</configSections><appSettings>之间加入对应Render的配置内容。

    3.使用

<add key="IsLine.ExceptionProcess.Configuration.RenderName" value="OracleUsingSPRender"/>指明异常使用的日志模型。“OracleUsingSPRender”是我们在第2步指明的两个日志模型其中一个的名字,现在系统中所有异常信息都会按照“OracleUsingSPRender”模型所描述的介质写入了。

   这时老板突然出现说,异常不用记Oralce了,记录文本文件就可以了,好吧,我们只需改一下异常渲染器的名字就可以,将“OracleUsingSPRender”改为“FileRender”,这样系统中的异常就会自动转向文本文件了。文本文件的路径在“AppenderInf”标签中描述,记录内容在“AppenderContent”标签中描述。

上述过程的配置代码请参考作者的博客

系统异常记录

    该命名空间负责记录系统中的异常信息,程序人员可以直接将.Net中的“Exception”对象直接抛送给ExceptionProcessProvider,该Provider自动将Exception类型转换为刚才提到的“LogEntity”,并写入相应的介质,对应介质以及其他信息与日志节点可以相同,亦可以使用单独节点,互不影响。

    另一种标准的ExceptionProcessProvider使用方式是值得推荐的,在上文中提到,系统设计时,一般本人会预先建立业务实体模型、业务事件模型、业务消息模型,在业务实体模型中,包括业务模型和异常模型。其中异常模型的设计是在系统设计阶段完成的,它预先定义了系统运行时可能会发生的错误,并为这些错误建立模型。

    每一种自定义的异常模型须继承ExceptionEntity基类,并实现IexceptionProcess接口,这样做不但量化了系统异常,有效管理了系统中的异常,而且增强了系统安全性。在上层调用异常模块时,也无须显示使用WriteLog()方法,当Catch捕获到系统异常后,ExceptionProcessProvider会自动拦截,并将进入ILFW异常模块的处理流程。

    IsLine FrameWork 目前支持两种异常记录模式:

  1. 使用ILException类记录异常

这种方式是最简单的方式,在对web.config进行简单的信息配置后,可以在程序中直接截获并记录异常,但缺点是需要对各种异常进行遍历。这种方式代码如下:

            try
           {
               string i = "i";
               Response.Write(i);
           }
           catch (Exception ex)
           {
               ILException ile = new ILException();
               ile.WriteLog(ex);
           }

   2.使用自定义异常记录异常信息

    自定义异常记录的方式是比较标准的OOP原则方式,你需要在系统设计阶段量化每一种异常,并且为这些异常建模,所有模型类必须继承ILException类,并且实现WriteLog()方法

    关于WriteLog()方法的实现,可以在异常类内部直接调用ILException的WriteLog(ex)实现,这是很简单的事情。

然后你就可以通过以下代码使用这个异常管理模块了:

            try
             {
                 string i = "i";
                 Response.Write(i);
             }
             catch (ILException ex)
             {
                 ex.WriteLog(ex);
             }

    由于事先对异常进行了定义,系统不必再遍历Exception树,所以这种方法拥有较高的性能,并且体现了抽象与封装的原则。

    系统异常模块除了记录功能,还有一个很重要的功能:异常展示,即系统发生异常后,展示给用户怎样的页面。展示给用户友好页面具有以下必要性:

    ● 展示给用户友好页面,可以降低用户焦虑感,提高用户体验。

    ● 将系统异常隐藏,避免代码、路径等技术信息外泄,提高系统安全性。

    ● 将系统运行时异常统一管理,有助于提高软件整体质量,便于整体把控。

    友好页面的展示类型也是根据配置节点信息完成的,管理员只需更改配置节点中的枚举值,即可改变用户体验页面,用户体验页面共有10中方式,分别是抛出原始异常信息、抛出定制异常信息、抛出简单信息(不包含异常)以及隐藏异常信息等方式。

    在系统开发阶段,可以使用抛出原始异常信息的展现方式,系统部署后,可以使用抛出简单信息(不包含异常)或隐藏异常信息的方式,选择这些展示方式的同时,还可以选择是否记录到日志介质。

    该异常模块完美的提供里以上功能,用户可以自由选择是否将特定内容记录到日志中,并确定记录介质;同时用户可以选择系统发生异常后,将以何种方式展现给用户。IsLine FrameWork为系统开发人员提供了多种异常记录方式,这些方式可以同时存在,只要你有这个需要,即你可以将不同业务的异常记录至不同的介质中;并且它还为系统提供了统一的异常展示方式,系统的异常将以一个统一的面貌返回给用户。异常记录与展示甚至是软件工程的系统需求分析阶段可以确定的,这将更有利于监控系统的运行。


本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2010/05/04/ilfw5.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
27天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
1月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
39 1
|
21天前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
44 3
|
21天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
30 1
|
27天前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
28天前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
59 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
132 2
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
27天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
27天前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器