C#中Release和debug模式下调试跟踪程序的原则和方法(二)

** 上接C#中Release和debug模式下调试跟踪程序的原则和方法(一) **


** 实现一个定制的 ** ** debug ** ** 类 ** ** **

不幸的是, debug 和 trace 类都不能重写,所以我们只好实现自己的版本,在我们的类中:
trace 使用 DEBUG 属性

  1. assert 使用 Trace 属性
  2. 添加了一个警告 (warm) 功能
  3. 添加了一个警告 / 错误词典。
  4. 实现了目前 trace/debug 的所有功能
  5. 可以简单把日志输出的一个文本文件中。
  6. 警告和 assert ,使用 debug 属性,可以产生一个用户友好的警告信息。
  7. 可以抓到未处理的异常,可以进一步提高用户友好特性。

** 测试版和发布版 ** ** **

在我们的 debug 类中,作了如下修改:
测试模式( debug mode) :

包括所有的跟踪模式( trace mode) 的功能 , 例如:

所有的写功能是打开的。

可以添加接受文件

所有的处理,清理,关闭接受文件的功能是打开的。

Trace mode:
跟踪模式( Trace mode):

可以初始化一个未知的异常

可以输出警告( Warn 方法)

可以打开 assert.


** 未知异常处理 ** ** **

下面的代码是一个未知异常处理器。它提供了一个平和中断程序的方法,作测试模式下 (debug mode), 可以把异常输出到文件中。

[Conditional( "TRACE" )]

public static void InitializeUnhandledExceptionHandler()

{

AppDomain.CurrentDomain.UnhandledException+= new UnhandledExceptionEventHandler(DbgExceptionHandler);

}

public static void DbgExceptionHandler(object sender, UnhandledExceptionEventArgs args)

{

Exception e=(Exception) args.ExceptionObject;

Trace.WriteLine( "Exception: " +e.Message+ "\n" +e.GetType()+ "\nStack Trace:\n" +e.StackTrace);

MessageBox.Show(

"A fatal problem has occurred.\n" +e.Message+ "\nin: " +e.GetType(),

"Program Stopped" ,

MessageBoxButtons.OK,

MessageBoxIcon.Stop,

MessageBoxDefaultButton.Button1);

Trace.Close();

Process.GetCurrentProcess().Kill();

}

** Warn ** ** 方法 ** ** **

下面的代码是解释如何给用户输出一个警告信息,提示他们应该作一些什么正确的操作。

[Conditional( "TRACE" )]

public static void Warn( bool b, DbgKey key)

{

if (!b)

{

Trace.WriteLine( "Warning: " +key.Name);

if (problems.Contains(key))

{

string explanation=GetExplanation(key);

MessageBox.Show(

explanation,

"Warning" ,

MessageBoxButtons.OK,

MessageBoxIcon.Warning,

MessageBoxDefaultButton.Button1);

}

else

{

MessageBox.Show(

"A problem has occurred that should be corrected.\n\nReference: " +key.Name,

"Warning" ,

MessageBoxButtons.OK,

MessageBoxIcon.Warning,

MessageBoxDefaultButton.Button1);

}

}

}

** Assert ** ** 方法 **

当调用一个重写的 Assert( bool b, DbgKey key) 方法时,可以产生一个断言信息,并提示给用户一个友好的信息。这个方法和上面的 warn 方法,可以使用错误字典来给用户显示一些有用的信息。

[Conditional( "TRACE" )]

public static void Assert( bool b, DbgKey key)

{

if (!b)

{

Trace.WriteLine( "Assert: " +key.Name);

if (problems.Contains(key))

{

string explanation=GetExplanation(key);

MessageBox.Show(

explanation,

"Program Stopped" ,

MessageBoxButtons.OK,

MessageBoxIcon.Stop,

MessageBoxDefaultButton.Button1);

}

else

{

MessageBox.Show(

"A fatal problem has occurred.\n\nReference: " +key.Name,

"Program Stopped" ,

MessageBoxButtons.OK,

MessageBoxIcon.Stop,

MessageBoxDefaultButton.Button1);

}

Trace.Close();

Process.GetCurrentProcess().Kill();

}

}

** Verify ** ** 方法 ** ** **

public static void Verify( bool b)

{

Assert(b, new DbgKey( "NEVER_FAIL" ));

}

** 添加到日志文件中 ** ** **

调用 LogOutput , 可以添加到日志文件中。

[Conditional( "DEBUG" )]

public static void LogOutput(string fn)

{

<P class=MsoNormal style="BACKGROUND: #fbedbb; MARGIN: 0in 0in 0pt; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt

Published At
Categories with Web编程
Tagged with
comments powered by Disqus