Kithara如何进行错误处理?

本文详细介绍了KitharaRealTimeSuite中错误处理的方法,包括使用错误代码返回值、错误类别编码、自定义错误字符串以及如何使用KS_getErrorString获取详细错误信息。作者通过示例展示了如何处理函数调用失败的情况和创建自定义错误码。
摘要由CSDN通过智能技术生成

错误处理



几乎所有 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
  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值