您的位置:首页 > 其它

Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇

2005-11-16 11:46 411 查看
Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
作者:Terrylee

一.把异常信息Logging到数据库

在日志和监测应用程序块中,有朋友提意见说希望能够把异常信息Logging到数据库中,在这里介绍一下具体的实现方法。

1.创建相关的数据库环境:

我们可以用日志和监测应用程序块自带的SQL语句来创建相关的数据库环境:

创建数据库:

CREATE DATABASE [Logging] ON (NAME = N'Logging', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\Logging.mdf' , SIZE = 1, FILEGROWTH = 10%) LOG ON (NAME = N'Logging_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\Logging_log.LDF' , FILEGROWTH = 10%)
创建表:

CREATE TABLE [dbo].[Log] (
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[EventID] [int] NULL ,
[Category] [nvarchar] (64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Priority] [int] NOT NULL ,
[Severity] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Title] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Timestamp] [datetime] NOT NULL ,
[MachineName] [nvarchar] (32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[AppDomainName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[ProcessID] [nvarchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[ProcessName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[ThreadName] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Win32ThreadId] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Message] [nvarchar] (2048) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[FormattedMessage] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

创建存储过程:

1CREATE PROCEDURE WriteLog
2(
3 @EventID int,
4 @Category nvarchar(64),
5 @Priority int,
6 @Severity nvarchar(32),
7 @Title nvarchar(256),
8 @Timestamp datetime,
9 @MachineName nvarchar(32),
10 @AppDomainName nvarchar(2048),
11 @ProcessID nvarchar(256),
12 @ProcessName nvarchar(2048),
13 @ThreadName nvarchar(2048),
14 @Win32ThreadId nvarchar(128),
15 @Message nvarchar(2048),
16 @FormattedMessage ntext
17)
18AS
19
20 INSERT INTO [Log] (
21 EventID,
22 Category,
23 Priority,
24 Severity,
25 Title,
26 [Timestamp],
27 MachineName,
28 AppDomainName,
29 ProcessID,
30 ProcessName,
31 ThreadName,
32 Win32ThreadId,
33 Message,
34 FormattedMessage
35 )
36 VALUES (
37 @EventID,
38 @Category,
39 @Priority,
40 @Severity,
41 @Title,
42 @Timestamp,
43 @MachineName,
44 @AppDomainName,
45 @ProcessID,
46 @ProcessName,
47 @ThreadName,
48 @Win32ThreadId,
49 @Message,
50 @FormattedMessage)
51GO

该SQL语句默认的路径为C:\Program Files\Microsoft Enterprise Library\src\Logging\Sinks\Database\Scripts,直接运行CreateLoggingDatabase.cmd即可。

2.运行配置工具,我们创建一个日志和监测应用程序块,并建一个Database Sink,具体的配置方法在日志和监测应用程序块中讲过了,这里就不重复了,我们看一下它的配置:

private void btn_Log_Click(object sender, System.EventArgs e)
7 public class AppTextExceptionFormatter : TextExceptionFormatter
5public abstract class ExceptionHandler : ConfigurationProvider, IExceptionHandler
该抽象类继承ConfigurationProvider类,并实现IExceptionHandler接口。ConfigurationProvider抽象类实现了IConfigurationProvider接口,用来读取配置数据。

1public abstract class ConfigurationProvider : IConfigurationProvider
使用支持序列化的数据类型作为配置参数,还有要注意数据类型的简单,避免“Exception Handling Exceptions”

看一下在Enterprise Library Quick Start中提供了定制Handler的实现:

1 public class AppMessageExceptionHandler : ExceptionHandler
5 {
6

public AppMessageExceptionHandler()
7



{
8

}
9


10

public override void Initialize(ConfigurationView configurationView)
11



{
12

}
13


14

public override Exception HandleException(Exception exception, string policyName, Guid correlationID)
15



{
16

DialogResult result = this.ShowThreadExceptionDialog(exception);
17


18

// Exits the program when the user clicks Abort.
19

if (result == DialogResult.Abort)
20

Application.Exit();
21


22

return exception;
23

}
24


25

// Creates the error message and displays it.
26

private DialogResult ShowThreadExceptionDialog(Exception e)
27



{
28

string errorMsg = e.Message + Environment.NewLine + Environment.NewLine;
29


30

return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
31

}
32

}

结束语:异常处理应用程序块的进阶篇就写到这里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐