对程序错误的处理

发表于:2007-05-25来源:作者:点击数: 标签:编程windows程序中的错误
windows编程中的错误处理 本文用于本人收藏之用。 阅读《windows核心编程》的笔记 开始windows编程之前,要了解windows函数是怎么做错误处理的。 当调用一个windows函数的时候。它首先检查传递给它的各个参数的有效性,然后再设法做处理。 当传入一个错误的

windows编程中的错误处理

本文用于本人收藏之用。

阅读《windows核心编程》的笔记

开始windows编程之前,要了解windows函数是怎么做错误处理的。

当调用一个windows函数的时候。它首先检查传递给它的各个参数的有效性,然后再设法做处理。

当传入一个错误的参数或操作在处理过程中出现不成功,则返回一个值。

当返回值是VOID的时候,是不可能错误的。

当返回值是LONG/DWORD的时候。windows处理比较复杂。一般如果返回0或-1 表示不能计数。

Microsoft公司编译了一个错误表,为每个错误分配一个32位的号码。当发生错误的时候。可以调用GetLastError()函数,得到最近的错误。注意:该函数只返回32位的错误号。

WinError.h中包含了错误代码的列表。这个文件的列表内容是这样的:

//MessageId: ERROR_SUCCESS

//MessageText:

//

//The operation completed suclearcase/" target="_blank" >ccessfully.

//

#define ERROR_SUCCESS  0L

... ...

每个错误都是这样描述的:错误ID号,错误文本,错误号码(一般,应该避免使用号码,可以使用ID号)。

同时记住:当windows函数运行失败,请立即运行GetLastError()函数进行错误处理。但是,当windows函数运行成功,它就不会改写错误代码,并不指明运行成功。(当然有例外)

在windows98中,不能使用这种机制来发现错误。因为,windows98很大部分是16位函数。

在调试的时候,在Watch窗口中输入“@err,hr”,就可以显示最后一个函数调用时的错误号码和错误英文描述文本

如果在程序编写中,想把错误显示给用户看,windows提供了一个函数:FormatMessage定义如下:

DWORD FormatMessage(DWORD dwFlags , LPCVOID pSource , DWORD MessageID , DWORD dwLanguageID ,

PTSTR pszBuffer , DWORD nSize , va_list * Arguments );

FormatMessage()函数的功能非常丰富,向用户显示消息,它是首选函数。后面会展示该函数的用法。

以上是windows的错误处理机制,你也可以在你的程序中使用这种机制。

将你认为合适的号码传给windows的线程池调用下面的函数:SetLastError(DWORD dwErrCode);

最好,能在WinError.h中存在的错误号。如果你实在是找不到反映你实际需要代码,可以自己创建错误号。

错误号可以划分域的:31~30 表示严重性(0 表示成功 1 表示供参考 2 表示警告 3 表示错误)

29 表示是用户定义的错误号还是是Microsoft定义:0 表示是Microsoft定义的 1 表示用户定义的。

28 是保留 必须是0 。

27~16 设备代码,由Microsoft定义。

15~0 错误代码,由Microsoft或用户定义。

这些,还会在以后的文章中涉及!

下面开始是一个示例程序,重点展示如何使用FormatMessage函数:

//This is a copy of the book windows kernel programing //I don't know how to translate the book's name.Please forgive me

///////////// *** program start now ***////////////////

// Get the error code

DWORD dwError = GetDlgItemInt(hwnd,IDC_ERRORCODE,NULL,FALSE);

HLOCAL hLocal = NULL; //Buffer that gets the error message strings

//Get the error code's textual discription

BOOL fOK = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,

NULL, dwError , MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), (LPTSTR) & hLocal , 0 , NULL);

... ...

if(!hLocal != NULL){

SetDlgItemText(hwnd,IDC_ERRORTEXT,(PCTSTR) LocalLock(hLocal));

LocalFree(hLocal);

}else{

SetDlgItemText(hwnd,IDC_ERRORTEXT,TEXT("Error number not found."));

}

今天就写这么多了。不愿意再写下去了。下面还有一个示例,就是上面这个程序的完整代码,我得好好研究。

这样才可以学习好编程~!

I like study

wsyghk

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)