内存或者硬盘空间不够、不能打开一个文件、外部设备不能访问、
网络连接不上或者甚至在程序中还有错误,目的是保持程序 的运行状态。如果你的程序是防御性的,别忘了使用断言。如果你使用断言,也别忘了防御性编程。这两种技术最好结合在一 起使用。
二、跟踪语句 1、基本概念 跟踪语句(trace statements)可使程序执行,并使程序员可对可变值进行查看。它们提供了一个用于观察的程序,并且独立于 一个交互式的调试器,但是最具有特色的是它们
常用于对调试器提供的信息进行补充。在 VC 中,跟踪消息通常输出到输出窗 口中的 Debug 标签,也可以重新输出到一个文件中。跟踪语句的特性如下: .跟踪语句用于报告代码中重要的运行事件。 .跟踪语句的编译通常是有条件的,并只存在于调试版本中,而在发布版本中不被编译。 .跟踪语句不能包含程序代码或对程序代码有间接的影响作用。 .跟踪语句的目的是向程序员提供信息,而不是向用户。 跟踪语句也是调试语句,它可以执行程序,并且在运行中
程序员可以查看变量。跟踪语句对于那些使用交互式调试器很难 调试的程序是很有效的。 跟踪语句和断言的区别如下: .跟踪语句是无条件的,断言是有条件的布尔语句。 .跟踪语句用于显示程序执行和变量值,不直接显示 bug,断言用于显示出 bug。 .跟踪语句将信息输出到调试窗口或文件中,可被随意地忽略,断言打断程序的执行。 2、MFC 中的跟踪语句 在 MFC 中, 你可以使用 TRACE
和 AfxOutputDebugString 宏、 CObject::Dump 虚拟函数和 AfxDumpStack 函数。 TRACE 宏 由 AfxDump 实现, AfxDump 由 AfxOutputDebugString 实现。 AfxOutputDebugString 宏和 AfxDumpStack 函数可以在所有版本中 编译,其他只能在调试版本中编译。 (1)TRACE 宏有以下形式: _TRACE(reportType,format); _TRACE0(reportType,format,arg1); _TRACE1(reportType,format,arg1,arg2); _TRACE2(reportType,format,arg1,arg2,arg3); _TRACE3(reportType,format,arg1,arg2,arg3,arg4); 在MFC 中, 推荐使用TRACEn 宏, 当使用TRACE 宏时需要使用_T 宏来格式化参数以正确解决Unicode 的校正, 而TRACEn 不需要。 MFC TRACE 宏中的一个缺点是AfxTrace 函数使用一个512 字符固定大小的缓冲区, 这使得它在跟踪长字符串时是无用的。 (2)CObject::Dump CObject 类有一个转储(dump)虚拟函数,所有继承 CObject 的类都可以通过重载这个函数,输出它们的值。 3、Visual C++消息 Pragma 消息 Pragma 实际上是一个编译时的跟踪语句,你可以使用它来警告在预处理过程中发现的潜在的编连(build)问题。典型的 例子: #if (WINVER>=0x0500) #pragma message (“NOTE:WINVER has been defined as 0x0500 or greater.”) #endif 消息 Pragma 是非常有用的,尤其是在复杂编连中。然而,如果你要检测一种特定的问题,而不是潜在的
问题,使用#error 预处理来代替打断编译会更直接一些。 每当你的程序中有错误而你想得到更多信息的时候,你应该去查看一下跟踪消息。由于 VC 输出窗口的缓冲区是有大小限 制的,因此如果跟踪消息数据产生的速度超过输出窗口处理的速度,那么消息会塞满缓冲区,导致数据丢失。避免这个问题的 简单方法是在输出大量数据的代码段如转储对象时,调用 Sleep API 函数。 三、异常 1、基本概念 错误是一种条件,在这种条件下,如果不执行额外的处理,线程就不能正常地执行下去。异常是用于处理错误的。使用异 常的一个很明显的好处就是它们通过发出错误信号,可以让程序代码和错误处理代码分开,而且不会让程序忽略错误,你不用 不断地检查函数的返回值,因此它们将程序代码简单化。另一个好处是它们不需要严格的编程作风。 异常的基本特性: .异常是基于每个进程而提出并处理