过完年买了一本好书《.NET模式 架构、设计与过程》,用了一个星期的时间把它通读了一遍,感觉里面的内容正是我所需要的,将我以前很多想到却不知道怎样实现的疑问都点破,但其中所以有的例子都是用C#写的,对于我来说还是不能全部看懂,所以想到用VB把书上所说的各种模式用VB来实现。
昨晚花了一个晚上的时间将“框架模式:异常处理、日志记录和跟踪”实现了,不过还有一个远程日志的功能没有实现,还没有进行应用测试。现在有人让我做一个VIP会员软件,正好可以把他用上。我现在把代码送上来,希望大家看看
首先建一个异常基类BaseException,它继承于System.ApplicationException,其他各种异常类都从BaseExceptionx继承,这样就可以程序中实现统一的异常处理和日志格式。日志的格式有以通过修改Formate函数实现不用的日志格式,
Imports System.Text
Imports System.xml
Imports System.net
Imports System.Web.Services.Protocols

Public Class BaseException
Inherits System.ApplicationException

Private m_Code As Integer

Public Sub New()

End Sub

Public Sub New(ByVal Message As String, ByVal Log As Boolean)
MyClass.New(Message, Nothing, Log)

End Sub

Public Sub New(ByVal Message As String, ByVal InnerException As System.Exception, ByVal Log As Boolean)
MyClass.New(Nothing, 0, Message, InnerException, Log)
End Sub

Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal Log As Boolean)
MyClass.New(Source, Code, Message, Nothing, Log)

End Sub

Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal InnerException As System.Exception, ByVal Log As Boolean)

If Not Source Is Nothing Then
MyBase.Source = Source.ToString
End If
m_Code = Code
'需要添加逻辑,用于检查日志的记录方式
'例如,文件,事件日志,数据库或运程调试器
If Log Then
'跟踪侦听器应该已经被初始化
'这是一种谨慎的方式
Utilities.InitTraceListeners()

'记录它
Dump(Format(Source, Code, Message, InnerException))
End If



End Sub

'<summary>
'这个构造函数通常用于从web服务中抛出SOAP异常
'这将以SOAP Fault支持的方式格式化错误消息
'填写在.NET中默认的包装异常方法尚未填写的字段
'</summary>
'<param name="Source"></param>
'<param name="Code"></param>
'<param name="Message"></param>
'<param name="InnerException"></param>
'<param name="Log"></param>
'<param name="ThrowSoap"></param>
Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal InnerException As System.Exception, _
ByVal Log As Boolean, ByVal ThrowSoap As Boolean)

MyClass.New(Source, Code, Message, InnerException, Log)

Dim Cause As String = "no root cause found"
Dim Node As XmlNode = Nothing

If ThrowSoap Then
If Not InnerException Is Nothing Then
Cause = InnerException.GetBaseException.Message

'现在构建细节的节点,用于SOAP异常
'--主要描述错误的根源
Node = BuildDetailNode(Cause)

Trace.WriteLine("Throwing Custom Soap Exception - Message" & Message)

'构建接收者或URI,用以设主actor字段
'用"/"替接".",从而组成一个URI.
'注意:如果请求的URI的精确的,那么,
'这个WEB服务必须在命名空间上匹配请求的URI
'我们不能在没有传递它的情况下使用上下文,因此,
'我们构建了一个URI

Dim Actor As New StringBuilder("http://")
Actor.Append(Dns.GetHostName)
Actor.Append("/")
Actor.Append("dotnetpatterns")
Actor.Append("/")
Actor.Append(Source.ToString.Replace(".", "/"))
Actor.Append(".asmx")

Throw New SoapException(Message, SoapException.DetailElementName, Actor.ToString, Node, InnerException)

End If
End If



End Sub

Private Function

Public Shared Function


End Class

还有一个公共类,主要是初始化侦听器,获取侦听参数
Imports System.IO

Public Class Utilities

'<summary>
'添加所有默认跟踪侦听器,对于事件日志跟踪
'将首先检查跟踪级别是否有被设为verbose(详细)
'或者information(信息),因为我们不希望用详细信息
'填满事件查看器(event viewer)
'</summary>
Public Shared Sub InitTraceListeners()
Dim TextWriter As System.IO.FileStream

'如果级别跟踪被设为information 或者 verbose,
'那么,我们不希望将信息转储到事件查看器
If Not TraceLevel.TraceInfo Then
If Trace.Listeners("TRACE_EVENTLOG_KEY") Is Nothing Then
Dim EvtLogListener As New EventLogTraceListener("EVENTLOG_SOURCE")
EvtLogListener.Name = "TRACE_EVENTLOG_KEY"
Trace.Listeners.Add(EvtLogListener)
End If
Else '跟踪级别被设为warning(警告) 或者 error(错误)
If Not Trace.Listeners("TRACE_EVENTLOG_KEY") Is Nothing Then
Trace.Listeners.Remove("TRACE_EVENTLOG_KEY")
End If
End If

If Trace.Listeners("TRACE_TEXTWRITER_KEY") Is Nothing Then
TextWriter = IIf(File.Exists("TRACE_LOG_FILE"), File.OpenWrite("TRACE_LOG_FILE"), File.Create("TRACE_LOG_FILE"))
Trace.Listeners.Add(New TextWriterTraceListener(TextWriter, "TRACE_TEXTWRITER_KEY"))
End If

'这是自定义的跟踪侦听器,用于远程跟踪
If Trace.Listeners("TRACE_REMOTE_KEY") Is Nothing Then
' Trace.Listeners.Add(New RemoteTrace("TRACE_REMOTE_KEY"))

End If

End Sub

'<system.diagnostics>
' <switches>
' <add name="TraceLevel" value="4" />
' </switches>
'</system.diagnostics>
'0(off), 1(error), 2(warning), 3(info),OR 4(verbose)
Public Shared TraceLevel As New TraceSwitch("TraceLevel", "Tracing Level")

End Class
代码里的注解还是比较清楚的,各位大侠能否提定意见,大家一起讨论一下。
昨天写我遇到的主要问题对C#语言不熟,通过写完以上代码,了解了C#中的null对应的是VB中的nothing,
this对应的是myclass,还有就是对Trace类不熟,现在明白了Trace 类中的Listeners是TraceListener 的集合,可以利用索引或字符串进行Add 和 Remote,侦听器主要有EventLogTraceListener,TextWriteTraceListener和DefaultTraceListener三种,还可以自定义侦听器。以上是我昨晚的收获,见笑了
这几天我要写一个会员管理软件,我要把我每天的进度都记录下来。
昨晚花了一个晚上的时间将“框架模式:异常处理、日志记录和跟踪”实现了,不过还有一个远程日志的功能没有实现,还没有进行应用测试。现在有人让我做一个VIP会员软件,正好可以把他用上。我现在把代码送上来,希望大家看看
首先建一个异常基类BaseException,它继承于System.ApplicationException,其他各种异常类都从BaseExceptionx继承,这样就可以程序中实现统一的异常处理和日志格式。日志的格式有以通过修改Formate函数实现不用的日志格式,
Imports System.Text
Imports System.xml
Imports System.net
Imports System.Web.Services.Protocols
Public Class BaseException
Inherits System.ApplicationException
Private m_Code As Integer
Public Sub New()
End Sub
Public Sub New(ByVal Message As String, ByVal Log As Boolean)
MyClass.New(Message, Nothing, Log)
End Sub
Public Sub New(ByVal Message As String, ByVal InnerException As System.Exception, ByVal Log As Boolean)
MyClass.New(Nothing, 0, Message, InnerException, Log)
End Sub
Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal Log As Boolean)
MyClass.New(Source, Code, Message, Nothing, Log)
End Sub
Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal InnerException As System.Exception, ByVal Log As Boolean)
If Not Source Is Nothing Then
MyBase.Source = Source.ToString
End If
m_Code = Code
'需要添加逻辑,用于检查日志的记录方式
'例如,文件,事件日志,数据库或运程调试器
If Log Then
'跟踪侦听器应该已经被初始化
'这是一种谨慎的方式
Utilities.InitTraceListeners()
'记录它
Dump(Format(Source, Code, Message, InnerException))
End If


End Sub
'<summary>
'这个构造函数通常用于从web服务中抛出SOAP异常
'这将以SOAP Fault支持的方式格式化错误消息
'填写在.NET中默认的包装异常方法尚未填写的字段
'</summary>
'<param name="Source"></param>
'<param name="Code"></param>
'<param name="Message"></param>
'<param name="InnerException"></param>
'<param name="Log"></param>
'<param name="ThrowSoap"></param>
Public Sub New(ByVal Source As Object, ByVal Code As Integer, _
ByVal Message As String, ByVal InnerException As System.Exception, _
ByVal Log As Boolean, ByVal ThrowSoap As Boolean)
MyClass.New(Source, Code, Message, InnerException, Log)
Dim Cause As String = "no root cause found"
Dim Node As XmlNode = Nothing
If ThrowSoap Then
If Not InnerException Is Nothing Then
Cause = InnerException.GetBaseException.Message
'现在构建细节的节点,用于SOAP异常
'--主要描述错误的根源
Node = BuildDetailNode(Cause)
Trace.WriteLine("Throwing Custom Soap Exception - Message" & Message)
'构建接收者或URI,用以设主actor字段
'用"/"替接".",从而组成一个URI.
'注意:如果请求的URI的精确的,那么,
'这个WEB服务必须在命名空间上匹配请求的URI
'我们不能在没有传递它的情况下使用上下文,因此,
'我们构建了一个URI
Dim Actor As New StringBuilder("http://")
Actor.Append(Dns.GetHostName)
Actor.Append("/")
Actor.Append("dotnetpatterns")
Actor.Append("/")
Actor.Append(Source.ToString.Replace(".", "/"))
Actor.Append(".asmx")
Throw New SoapException(Message, SoapException.DetailElementName, Actor.ToString, Node, InnerException)
End If
End If


End Sub
Private Function
Public Shared Function

End Class
还有一个公共类,主要是初始化侦听器,获取侦听参数
Imports System.IO
Public Class Utilities
'<summary>
'添加所有默认跟踪侦听器,对于事件日志跟踪
'将首先检查跟踪级别是否有被设为verbose(详细)
'或者information(信息),因为我们不希望用详细信息
'填满事件查看器(event viewer)
'</summary>
Public Shared Sub InitTraceListeners()
Dim TextWriter As System.IO.FileStream
'如果级别跟踪被设为information 或者 verbose,
'那么,我们不希望将信息转储到事件查看器
If Not TraceLevel.TraceInfo Then
If Trace.Listeners("TRACE_EVENTLOG_KEY") Is Nothing Then
Dim EvtLogListener As New EventLogTraceListener("EVENTLOG_SOURCE")
EvtLogListener.Name = "TRACE_EVENTLOG_KEY"
Trace.Listeners.Add(EvtLogListener)
End If
Else '跟踪级别被设为warning(警告) 或者 error(错误)
If Not Trace.Listeners("TRACE_EVENTLOG_KEY") Is Nothing Then
Trace.Listeners.Remove("TRACE_EVENTLOG_KEY")
End If
End If
If Trace.Listeners("TRACE_TEXTWRITER_KEY") Is Nothing Then
TextWriter = IIf(File.Exists("TRACE_LOG_FILE"), File.OpenWrite("TRACE_LOG_FILE"), File.Create("TRACE_LOG_FILE"))
Trace.Listeners.Add(New TextWriterTraceListener(TextWriter, "TRACE_TEXTWRITER_KEY"))
End If
'这是自定义的跟踪侦听器,用于远程跟踪
If Trace.Listeners("TRACE_REMOTE_KEY") Is Nothing Then
' Trace.Listeners.Add(New RemoteTrace("TRACE_REMOTE_KEY"))
End If
End Sub
'<system.diagnostics>
' <switches>
' <add name="TraceLevel" value="4" />
' </switches>
'</system.diagnostics>
'0(off), 1(error), 2(warning), 3(info),OR 4(verbose)
Public Shared TraceLevel As New TraceSwitch("TraceLevel", "Tracing Level")
End Class
昨天写我遇到的主要问题对C#语言不熟,通过写完以上代码,了解了C#中的null对应的是VB中的nothing,
this对应的是myclass,还有就是对Trace类不熟,现在明白了Trace 类中的Listeners是TraceListener 的集合,可以利用索引或字符串进行Add 和 Remote,侦听器主要有EventLogTraceListener,TextWriteTraceListener和DefaultTraceListener三种,还可以自定义侦听器。以上是我昨晚的收获,见笑了
这几天我要写一个会员管理软件,我要把我每天的进度都记录下来。

浙公网安备 33010602011771号