错误处理
几乎所有 Kithara RealTime Suite 的函数都会返回可能的错误代码。您应该始终将错误作为返回值,并做出适当的反应!如果某个资源无法成功创建,那么就不要调用使用该资源的其他函数。如果遇到错误代码,您可以使用 KS_getErrorString 请求更详细的错误文本:
在函数描述的参考部分中命名的错误代码仅指示错误的最可能原因。更多的错误代码可能会被返回。一般错误,例如“错误的参数值”(KSERROR_BAD_PARAM)或“驱动程序尚未打开”(KSERROR_DRIVER_NOT_OPENED)原则上会在几乎任何函数中出现,但它们不一定总是以这种方式指示。
错误代码
在大多数情况下,函数的返回值实际上是一个错误代码。这允许确定函数调用的成功或错误的确切原因。错误代码是一个32位值,其中常量在头文件中定义。这些常量只占据了位16…29。每个相应错误代码的位0…15以及30…31可能包含一个额外值,用于精确的规范和操作系统错误代码。错误代码的构成如下:
Bit position in error code Description
31 16 0
..CCCCCC ........ ........ ........ Error category
........ EEEEEEEE ........ ........ Error within the category
........ ........ PPPP.... ........ Extra information
SS...... ........ ....SSSS SSSSSSSS Operating system error code
错误类别将值0x10000000到0x3f000000分配给C位(位24…29)。从0x01000000到0x0f000000的范围供用户使用。
在每个类别中,有256个可能的错误代码(E位16…23)。附加条目(P位12…15)允许准确地定位源代码中的错误。只要可用,错误代码将通过由操作系统函数给出的常量(S位)进行补充。
警告!
由于它们通过操作系统常量进行了补充,因此不应将其与特定错误代码进行相等性测试!在进行测试之前,必须对相应的位进行掩码处理:
if ((error & 0x3fff0000) == KSERROR_WAIT_TIMEOUT)
...
// or
if (KSERROR_CODE(error) == KSERROR_WAIT_TIMEOUT)
...
单个错误代码常量与错误类别一起在头文件中定义,例如:
示例1
KSERROR_CATEGORY_PORT = 0x19000000;
KSERROR_PORT_BUSY = KSERROR_CATEGORY_PORT | 0x00020000;
该常量的值为0x19020000。在特定情况下,剩余的位也可以被分配,例如用操作系统代码。
示例2
KSERROR_CATEGORY_BASE = 0x10000000;
KSERROR_BAD_PARAM = KSERROR_CATEGORY_BASE | 0x00060000;
该常量的值为0x10060000。如果发生常见的“错误参数”错误,附加的条目(P位12…15)将描述导致错误的参数。例如,值0x10063000表示在函数调用期间第三个参数不正确。
错误码0表示KS_OK
当函数成功执行时,它会返回定义为0(KS_OK)的值。除了0以外的值通常表示函数未成功执行,并描述了确切的原因。
我们建议使用KS_getErrorString(Ex)函数来简化出现错误。它包含错误码,并提供一个包含错误文本。
char* pErrorString;
int kserr = KS_getErrorString(
error, // Error code
&pErrorString, // Address of pointer variable
KSLNG_DEFAULT); // Default constant
if (kserr)
printf("Error in KS_getErrorString - Unable to get error string of %08X",
error);
else
printf("Error %08X = \'%s\'", error, pErrorString);
在示例中,其中包含显示错误码和字符串的完整代码。在您的应用程序中,您可以构建类似的函数。
自定义错误码
可以使用KS_addErrorString创建自己的错误代码。
项目实例
#include <iostream>
#include <KrtsDemo.h>
const char customerNumber[256] = "DEMO";
void OutputErr(KSError error, const char* pFuncName, const char* pComment)
{
if (error == KS_OK)
return;
const char* pError;
KS_getErrorString(error, &pError, KSLNG_DEFAULT);
printf("ERROR (%08X = \'%s\') - %s: %s\n", error, pError, pFuncName, pComment);
}
int main()
{
KSError error;
error = KS_openDriver(customerNumber); // 所有Kithar项目的第一步
if (error != KS_OK)
{
OutputErr(error, "KS_openDriver", "Unable to open the driver!");
return 0;
}
else
{
printf("Hello Kithara! \n");
}
// 测试输出错误
error = KSERROR_NO_LICENCES_FOUND;
OutputErr(error, "TestError", "No Licences!");
// 自定义错误输出
KSError myErrorCode = KSERROR_CATEGORY_USER + 0x00770000;
error = KS_addErrorString(myErrorCode, "KSERROR_MY_ERROR_CODE", KSLNG_DEFAULT);
if (error != KS_OK)
{
OutputErr(error, "KS_addErrorString", "Unable to add error string.");
return 0;
}
OutputErr(myErrorCode, "MyError", "OutPut My Error");
KS_closeDriver();
return 0;
}
更过示例请查阅安装目录下: .
\Kithara\RealTime Suite Demo\smp\BaseFunctions