函数返回值及错误码设计
最近在编写函数过程中,发现函数的返回值是个很重要的参考量,在较⼤规模的软件⼯程⾥⾯,多个类的使⽤是必然的,多种类结构的使⽤会使得⼯程变得复杂,要是代码运⾏过程中产⽣了错误,定位错误也是个很困难的问题。
⾸先,如果是在类内部的话,我们可以通过在内部函数加⼊错误码,然后写⼀个获取错误码的函数。具体使⽤如下:
class GetError
{
public:
void FunctionA(int a, int b)
{
/*代码⽚段⼀*/
m_iErrorCode = 1;
/*代码⽚段⼆*/
m_iErrorCode = 2;
/*代码⽚段三*/
m_iErrorCode = 3;
/*代码⽚段四*/
m_iErrorCode = 4;
/*代码⽚段五*/
m_iErrorCode = 5;
}
void FunctionB(int a, int b)
{
/*代码⽚段⼀*/
m_iErrorCode = 6;
/*代码⽚段⼆*/
m_iErrorCode = 7;
/*代码⽚段三*/
m_iErrorCode = 8;
}
enum函数int GetLastError()
{
return m_iErrorCode;
}
private:
int m_iErrorCode;
};
通过这样的设计,我们就可以知道哪⾥出了问题,定位到程序的某⼀个位置。只不过这样拿到的错误码只是数字,在错误码较多的情况下很容易造成混淆,也⽆法第⼀时间定位问题。因此我们可以把错误码做成枚举类型的量。如:
typedef enum ErrorCode
{
CALLFUNCTIONSUCCESS = 0, //函数调⽤成功
PARMISEMPTY = -1,  //传⼊参数为空
CALLFUNCTIONFAIL= -2,      //函数调⽤失败
OTHERERROR=-3  //其他未知错误
/*······*/
};
这样返回的时候就可以通过在枚举类型中查相应的值来定位错误,⽽值的名称也是可以定义为相应的错误描述。
实例如下:
class ErrorCodeManagerOne
{
public:
int FunctionA()
{
/*代码⽚段⼀*/
return PARMISEMPTY;
/*代码⽚段⼆*/
return CALLFUNCTIONFAIL;
}
int FunctionB()
{
/*代码⽚段⼀*/
return PARMISEMPTY;
/*代码⽚段⼆*/
return CALLFUNCTIONSUCCESS;
}
};
class ErrorCodeManagerTwo
{
public:
int FunctionC()
{
/*代码⽚段⼀*/
return OTHERERROR;
}
};
如果是在复杂的类结构中的话,我们可以通过把错误码枚举类型放在类的公共头⽂件⾥,这样不管什么
对象都可以直接使⽤这些错误码,要是有增加错误码,就在头⽂件⾥增加相应的错误码及说明即可。然后就可以通过查枚举的值得名称来定位错误,这也是⼀种⽐较好的定位⽅法,不⽤考虑多次调⽤函数做错误码返回或者拼接,⽽是在所有类共⽤同⼀份错误码,这样可以进⾏快速定位或者给错误码相应的错误描述,展⽰给⽤户。