Windows程序的错误处理

Eddy 发布于2009-11-18 16:26:53 分类: 程序设计 已浏览loading 网友评论0条 我要评论

数据类型               表示失败的值

VOID                     该函数的运行是不可能失败的。这种函数在Widows中很少见。
BOOL                    如果函数运行失败则返回0,否则返回非0值。调用这些函数时最好对函数的返回值进
                              行测试。测试时请与0进行比较。不要与TRUE进行比较
HANDLE              如果运行失败,返回值通常为空,否则返回值为HANDLE,用于标识你可以操作的一个对象。注意:有些函数会返回一个句柄值INVALID_HANDLE_VALUE,它定义为-1.
PVOID                  如果函数运行失败,则返回NULL,否则返回PVIOD,以标识数据块的内存地址。
LONG/DWORD  有点难处理,返回值通常是LONG或者DWORD。如果由于某种原因,函数如果没发对想要计数的对象计数的话,那么该函数返回0或者-1(根据函数而定),如果返回的值是LONG/DWORD的话,有可能该值不是正确的值

现在我们知道了函数返回值哪些是错误的了。如果想知道为什么会返回一个错误的值,那么请调用:

GetLastError函数:DWORD GetLastError();注意,该函数返回线程的32位错误代码(错误码对应的错误在WinError.h文件中)。如下:
#define ERROR_FILE_NOT_FOUND             2L
//
// MessageId: ERROR_PATH_NOT_FOUND
//
// MessageText:
//
//  The system cannot find the path specified.
//
#define ERROR_PATH_NOT_FOUND             3L
//
// MessageId: ERROR_TOO_MANY_OPEN_FILES
//
// MessageText:
//
//  The system cannot open the file.
//
如上所见:每个错误代码都由三部分组成:消息ID(可以在源代码中使用的宏,以便与GetLatError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(应该避免使用,请使用消息ID)。
    最后,Windows函数运行失败时请立即调用GetLastError函数。如果调用其他的Windows函数,他的值就很有可能被改写。

如何获取WinError.h文件中定义的错误描述?

当在编写应用程序时需要把错误信息显示给用户,请使用FormatMessage函数,该函数将错误代码转换为文本描述。函数原型如下:(该函数很有用,比方说很容易实现多国语言的互换)
     DWORD FormatMessage(
     DWORD dwFlags,   //告诉FormatMessage函数,想要的特点
     LPCVOID lpSource,  //
    DWORD dwMessageId,  //消息ID
     DWORD dwLanguageId, //
     LPTSTR lpBuffer,  //可以是ANSI,也可以是Unicode,用来接受与MessageID对应的Description。
     DWORD nSize, //buff的大小。
     va_list* Arguments
);
 
   har szError[256];
   DWORD dwError = GetLastError();
   FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,                       
    0,
    0,
    szError,
    sizeof(szError),
    NULL);
   AfxMessageBox(szError);
如何定义自己的错误代码?
      上面讲到了Windows函数如何向函数的调用者指明发生错误,现在我们看看如何使自己的函数也有报告错误的功能。
      适用场所:当你写一个他人调用的函数,你的函数可能因为种种原因而调用失败,你必须告诉函数的调用者该函数运行失败,但是你还想通知函数调用者该函数为什么失败(很不错哦,这样就与Windows只带的函数一样了哈,是不是很不错哦)。
     若要指明函数调用失败,只需要设定线程的最后错误代码,然后让你的函数返回FLASE、INVALID_HANDLE_VALUE、NULL或者其他约定的信息。请使用如下方法设定线程的最后错误代码。
     函数原型:
     void SetLastError(
     DWORD dwErrCode  //请使用WinError.h文件中已经存在的错误代码。当然也可以创建自己的错误代码,一般情况下没有必要。
     );

 

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/program/117.html     欢迎订阅Eddy Blog

关于 Windows程序  错误处理  的相关文章

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言