函数返回问题
一个应用系统要正确稳写地运行,必须要对各个函数的返回值进行正确的判断,若函数没有正确的持行,而上层应用又没有进行错误处理的话,程序很有可能进入到一个不确写的状态。从而导至系统的不稳定,那么当一个函数没有正确持行时,应当怎样返回才能使上层调用方便地知道函数没有正确持行而进行错误处理呢,又要怎样才能使错误处理代码简单而有效呢。
方案一:若函数成功返回,则返回一个正值,错误时返回一个负值。
如:return i (函数成功返回) return –ERR(函数出错时返回)。
在方案一中,有如下二个问题:
1. 若某个函数的正确返回值为负时(如一个数学运算函数)则上层调用就不能用if (返回值<0) {出错处理}来判断。
2. 若函数的返回值为无符号型,则这样的函数不能返回一个负值。(如一个返回整型的句柄函数)。
方案二:函数的返回值为布尔型。成功调用时返回“TRUE”,错误时返回“FALSE”,再用一个指针指向出错的具体原因。如函数声明:BOOL Funcation(int a,char b,int* err);其中第三个参数“int *err”可以指向一个int 型的变量,我们可以用它来指明错误的具体原因。
如:BOOL Funcation(int a,char b,int* err)
{
if(a输入参数错误)
{
*err=参数错误宏定义;
Return FALSE;
}
……
}
这样的话,当上层函数调用这个函数时若返回值为FALSE,则可从err变量中读出具体的出错原因。
如:
BOOL TestFuncation(void)
{
int err;
if(FALSE==Funcation(1,c,&err))
{
//函数Funcation 调用出错
Switch(err)
{
Case … //错误处理
}
}
}
方案二中每次在调用函数前都要声明一个用于获取函数调用错误的指针,且函数的参数要增加一个。而对于一些已经定义好的函数,如Windows 下的创建线程函数CreateThread(),就不可以再增加一个参数用于获取具体的错误原因。
方案三:当下层函数调用出错时,可以有另一个函数(如:GetLastERR( ))读出错误的具体原因。则调用一个函数时用如下语句:
BOOL TestFuncation(void)
{
if(FALSE==Funcation(1,2))//函数调用出错
{
Switch(GetLastERR())//读出并判断出错原因
{
Case ……//错误处理
}
}
}
方案三中,要实现GetLastERR()函数,就必需要一个全局变量用于存放函数最后一次出错的原因。这样会使一个设计中的全局变量增多。
其实现过程如下程序段:
int errfalg //定义一个全局变量,用于存放最后一次出错的原因
BOOL Funcation(int a,int b)
{
if(a输入参数错误)
{
Errfalg=参数错误宏定义;
Return FALSE;
}
……
}
int GetLastERR(void)
{
return errfalg;
}
2006年11月2日星期四
周群威