** 上接C#中Release和debug模式下调试跟踪程序的原则和方法(一) **
** 实现一个定制的 ** ** debug ** ** 类 ** ** **
不幸的是, debug 和 trace 类都不能重写,所以我们只好实现自己的版本,在我们的类中:
trace 使用 DEBUG 属性
- assert 使用 Trace 属性
- 添加了一个警告 (warm) 功能
- 添加了一个警告 / 错误词典。
- 实现了目前 trace/debug 的所有功能
- 可以简单把日志输出的一个文本文件中。
- 警告和 assert ,使用 debug 属性,可以产生一个用户友好的警告信息。
- 可以抓到未处理的异常,可以进一步提高用户友好特性。
** 测试版和发布版 ** ** **
在我们的 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