Exception怎么生成是一回事,怎么展示又是还有一回事了。

Exception Block主要关注的点在于Exception信息的展示。Exception不同于一般的log信息,是系统设计者未考虑的错误情况。当异常出现时,错误的情况,或者暴露一些比較敏感的系统信息。或者将一些不怎么友好的信息显示给一些不怎么友好的客户。这时一个计算机异常就引入了一个客户异常,一个终极异常。所以异常处理的目标就是截断异常,进而恢复系统。

把合理的异常信息显示给相相应的用户。

因此主要的异常处理脉络也出现了。1.识别异常类型 2.决定处理策略 3.异常转化。第二点不是必须的,实际我们能够什么都不做。我们看一个最主要的样例

let exceptionShielding = [new ExceptionPolicyEntry(typeof<Exception>,
PostHandlingAction.ThrowNewException,
[|new WrapHandler("Application Error. Please contact rigid", typeof<Exception>)|])]

这个ExceptionPolicyEntry类的构造函数就包括了以上三个基本点。第一个參数是须要识别的异常类。实际的应用中异常特化的越具有特征性我们也就越可以识别此异常。只使用Exception带字符串对分类处理并没有什么优点。第二个枚举类型代表了处理策略。在处理完毕后再次抛出异常和忽略此异常都是比較经常使用的情况。最后是提供异常转化的详细方法,这里我们看到的是一个WrapHandler,类似于装饰者模式给原始的异常加一层壳。

详细的应用例如以下。

let policies = [new ExceptionPolicyDefinition("Wrap Exception", exceptionShielding)]

let exceptionManager = new ExceptionManager(policies)
ExceptionPolicy.SetExceptionManager(exceptionManager) //most simple example
exceptionManager.Process((fun () -> 1/0 ), "Wrap Exception")

获取异常时我们不再使用try catch块,而是通过ExceptionManager的Process进行隐式处理。由于全部该进行的处理都在事先确定了,所以并不缺少什么。这里也并不是没有灵活处理异常的手段,也能够手动获得异常对象有针对性的进行处理。





我们做一个带日志的异常处理的样例。将原异常的信息进行替换后存入日志文件。

再进行封装操作。

首先应用日志模块生成一个日志处理对象

#if COMPILED
#else
#r "[Xpath]/packages/EnterpriseLibrary.Data.6.0.1304.0/lib/NET45/Microsoft.Practices.EnterpriseLibrary.Data.dll"
#r "[Xpath]/packages/EnterpriseLibrary.Common.6.0.1304.0/lib/NET45/Microsoft.Practices.EnterpriseLibrary.Common.dll"
#r "[Xpath]/packages/EnterpriseLibrary.ExceptionHandling.6.0.1304.0/lib/NET45/Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll"
#r "[Xpath]/packages/EnterpriseLibrary.ExceptionHandling.Logging.6.0.1304.0/lib/NET45/Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll"
#r "[Xpath]/packages/EnterpriseLibrary.Logging.6.0.1304.0/lib/NET45/Microsoft.Practices.EnterpriseLibrary.Logging.dll"
#r "System"
#r "System.Data"
#r "System.Configuration"
#r "System.ServiceModel"
#endif open System
open System.Configuration
open Microsoft.Practices.EnterpriseLibrary.ExceptionHandling
open Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging
open Microsoft.Practices.EnterpriseLibrary.Logging
open Microsoft.Practices.EnterpriseLibrary.Logging.Formatters
open Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners
open System.Diagnostics //make logger
//format
let formatter = new TextFormatter("TimeStamp: {timestamp}{newline}Message:{message}{newline}Category:{category}{newline}Priority:{priority}{newline}EventID:{eventid}{newline}Severity:{severity}{newline}Title:{title}{newline}Machine:{machine}{newline}App Domain:{localAppDomain}{newline}ProcessID:{localProcessId}{newline}Process Name:{localProcessName}{newline}Thread Name:{threadName}{newline}Win32 ThreadID:{win32Thread}{newline}Extended Properties:{dictinary({key}-{value}{newline})}")
//listener
let flatFileTraceListener = new FlatFileTraceListener(@"c:\Temp\this.log", "------------------------------", "------------------------------",formatter)
let eventlog = new EventLog("Application", ".", "Enterprise Libray Logging")
let eventlogTraceListener = new FormattedEventLogTraceListener(eventlog)
//configuration
let config = new LoggingConfiguration()
config.AddLogSource("General", SourceLevels.All, true, [|flatFileTraceListener :> TraceListener|]) |> ignore
let logWriter = new LogWriter(config)

兴许的代码和之前的并无太大差别,加Policy条目。引用时注意类型字符串。

let exceptionShielding = [new ExceptionPolicyEntry(typeof<Exception>,
PostHandlingAction.ThrowNewException,
[|new WrapHandler("Application Error. Please contact rigid", typeof<Exception>)|])
] let replacingException = [new ExceptionPolicyEntry(typeof<Exception>,
PostHandlingAction.ThrowNewException,
[|new ReplaceHandler("Application Error. Please contact rigid", typeof<Exception>)|])
]
let loggingAndReplacing = [new ExceptionPolicyEntry(typeof<Exception>,
PostHandlingAction.NotifyRethrow,
[|new LoggingExceptionHandler("General", 1000, TraceEventType.Error, "Rigid Service", 5, typeof<TextExceptionFormatter>, logWriter);
new ReplaceHandler("Application Error. Please contact rigid", typeof<Exception>)|])
] let policies = [new ExceptionPolicyDefinition("Wrap Exception", exceptionShielding);
new ExceptionPolicyDefinition("Replace Exception", replacingException);
new ExceptionPolicyDefinition("Log and Replace Exception", loggingAndReplacing)] let exceptionManager = new ExceptionManager(policies)
ExceptionPolicy.SetExceptionManager(exceptionManager) //most simple example
exceptionManager.Process((fun () -> 1/0 ), "Log and Replace Exception")

以上最基本概念,技术重点在异常怎样分类组织。与权限进行相应。

通过Fsharp探索Enterprise Library Exception的更多相关文章

  1. 通过fsharp 使用Enterprise Library Unity 3 - 三种拦截模式的探索

    这篇就三种拦截模式进行一下探索. 特性总结   类型 特点 其它 InterfaceInterceptor Innstance 仅单接口 类内部函数互相引用无法引起拦截行为 TransparentPr ...

  2. 通过fsharp 使用Enterprise Library Unity 2

    接着Depandency Injection继续. 最想做的还是用现成的程序模块对程序进行行为注入.只是不急,在此之前自己写一个接口对象观察一下IInterceptionBehavior接口的功效. ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  4. Enterprise Library系列文章目录(转载)

    1. Microsoft Enterprise Library 5.0 系列(一) Caching Application Block (初级) 2. Microsoft Enterprise Lib ...

  5. Enterprise Library 5.0 系列教程

    1. Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (初级) 2. Microsoft Enterprise L ...

  6. Enterprise Library 4 数据访问应用程序块

    Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务.应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据.传递数据穿过应用程序层( applicat ...

  7. Enterprise Library 服务问题

    在使用Enterprise Library而没有注册服务的时候会出现这样的问题,"Editing Post "Failed to create instances of perfo ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...

随机推荐

  1. 理解javascript的闭包,原型,和匿名函数及IIFE

    理解javascript的闭包,原型,和匿名函数(自己总结) 一 .>关于闭包 理解闭包 需要的知识1.变量的作用域 例1: var n =99; //建立函数外的全局变量 function r ...

  2. LinuxMint下JDK+Tomcat+Mysql+Eclipse javaEE安装

    网上查了很多方法,总结下比较简单的做法. 本人使用的系统版本为64位LinuxMint18,cinnamon桌面环境,预装Openjdk1.8.开发使用版本为oracle的1.7版本jdk. 1 jd ...

  3. bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼

    1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 1261  Solved: 578[Submit] ...

  4. AtCoder Grand Contest 018 A

    A - Getting Difference Time limit時間制限 : 2sec / Memory limitメモリ制限 : 256MB 配点 : 300 点 問題文 箱に N 個のボールが入 ...

  5. 行为型设计模式之模板方法(Template Method)

    结构 意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 适用性 一次性 ...

  6. js实景题

    测天然气流量的仪器每5分钟向数据库插入一条数据,[{time:18:05,value:222},{time:18:10,value:333},{time:18:15,value:444}....... ...

  7. 从jscript脚本混淆说起

    转载:http://www.freebuf.com/column/144897.html 脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低.混淆加密方式 ...

  8. flask框架基本使用(2)(响应与重定向)

    #转载请留言联系 flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from ...

  9. vim注释颜色更改

    通过putty或者securecrt连到linux服务器,使用vi编辑*.php 或*.c文件时, 蓝色的注释很淡,看不清,看起来很费眼 效果如下 我本身有习惯于默认配色,不想修改配色方案,只想把看不 ...

  10. CF978C Letters【前缀和+二分查找/几房几号】

    [链接]:CF978C [分析]:在前缀和数组种二分找到>=询问数的位置,根据位置就好操作了 [代码]: #include<bits/stdc++.h> using namespac ...