首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义错误码

定义错误码
EN

Software Engineering用户
提问于 2014-09-09 15:32:30
回答 2查看 8.8K关注 0票数 6

我们正在为用C语言编写的密码库设计一个错误处理框架。

我们采用的方法是将相对较少的错误传播回用户,因为在大多数情况下,他无法对它们做任何事情(值得注意的例外:参数验证错误)。当然,如果呼叫成功,我们会告诉用户。我们还会为故障调查创建日志条目。)简而言之,仅仅因为我们在库中某个地方有一个错误条件,并不意味着我们需要一个公共的(面向用户的)错误代码。

此外,根据过去的经验,我们认为需要错误代码的错误条件中有很大一部分涉及到非常狭窄的代码领域,通常情况下,特定的错误只从一个函数返回(或由一个函数设置)。

因此,我们希望在尽可能低的级别上定义错误代码。例如,如果只有一个函数可以返回/设置特定的错误代码,我们将在声明函数原型的.h文件中定义该代码。

然而,在这种情况下,我们可能会得到错误代码冲突-相同的错误代码值不同的错误。有人能提出一个优雅的方法来避免这样的冲突吗?或者至少有一种自动机制来检查这些冲突(然后可以手工修复)?

EN

回答 2

Software Engineering用户

发布于 2014-09-09 15:51:46

我们将在声明函数原型的.h文件中定义该代码。

我建议您不要这样做,因为您没有任何东西可以减少潜在编号冲突的空间。

相反,使用一个为客户端和服务器应用程序提供错误代码的通用头文件。作为替代,客户端文件可以只是服务器错误代码文件的子集。

在通用头文件中,应用程序的每个主要区域都将获得一系列错误编号。在每个主要区域内,您可以为该层中的模块分配错误代码范围子集。

例如,假设服务器应用程序中有会话管理器、业务逻辑和数据库访问层。您的头文件可能会按以下方式被分解:

代码语言:javascript
复制
/*
 * our error.h file 
 */
/* Common Errors 0 - 99 */
#define SUCCESS 0
#define GENERIC_ERROR 1
/* Session Manager errors 100 - 199 */
    /* Login issues 100 - 110 */
#define BAD_PASSWORD 101
    /* session issues 120 - 125 */
    /* other session issues 150 - 162 */
#define SOMETHING_ELSE 150
/* Business logic errors 200 - 299 */

/* Database errors 300 - 399 */
#define INVALID_CONNECTION 300

这种方法的优点是减少了可能发生编号冲突的总体空间。潜在的冲突仅限于两个或多个开发人员同时工作的领域。

通过有一个常见的错误头文件,您的开发人员可以根据需要签出该文件,以创建一个新的错误,并确保他们在那个时候声称有一个未使用的号码。

这种方法的潜在缺陷是开发人员不经常提交错误标头的本地副本。但是,这是一个流程问题,一旦开发人员不得不处理几次,这个问题通常就会解决。由于他们指的是通过#define的错误号,所以这并没有那么大的变化。

另一个陷阱是当你误判一个层或子模块所需的范围时。避免这种情况的最简单方法是为每个层和子模块预先分配非常大的范围。从那里,你应该可以修剪从一个子模块,以便给另一个更大的范围。没有什么能说明范围必须是毗连的。

票数 4
EN

Software Engineering用户

发布于 2014-09-09 16:41:13

我建议使用一个与@GlenH7 7完全相同的通用错误代码文件,但我也建议编写完全不需要全局错误文件的自包含函数或模块。例如,如果“`connect”函数可能只是失败(或失败),则返回一个布尔指示符。该函数的调用方可以决定将布尔值返回值映射到全局常量,但不能将连接函数本身映射为:

代码语言:javascript
复制
  success = connect(parameters);
  if(!success)
      return INVALID_CONNECTION;

  success = check_password(paramaters);
  if(!success)
      return BAD_PASSWORD;

  //...
  return SUCCESS;

对于由许多不同的模块或库组成的大型软件,可能是由不同的团队开发的,通常最好避免任何全局错误代码,而只使用本地的每个模块或每个库的错误代码。例如,在中央日志文件中,为了消除这些问题,您必须将模块名或某种模块ID添加到错误代码中。您可以通过正确地设计记录器API来强制使用这两个值--一个"log“函数需要一个模块ID和一个错误代码作为参数,而不仅仅是一个错误代码。如果您真的必须以一种全局可区分的方式传递程序周围的错误代码,您可以创建一个结构"ErrorCode",其中包含两个属性"ModuleID“和"LocalErrorCode”。这样,您就可以完全避免具有全局错误代码的需要。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/255821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档