您如何分配错误代码?


13

在开发中型项目时,如何识别,创建和维护错误代码?

我一生都无法想到一种简单而干净的方法。我的一些想法将类名和方法名转换为整数字符串,但这是很长的时间,因为方法名和类名可能会更改(希望不会!)。其他人只是使用递增日志系统(即,当我创建新的错误消息时,只需在最后一个错误消息ID上加1)。但这完全是无组织的。

更具体地说,我正在谈论错误代码,例如:

Error 401 Unauthorized.


1
错误代码?像“魔术数字”?例如...错误001。然后您转到列表,然后读取错误001,则表示是...是吗?
wleao

@wleao-是的 我将编辑我的问题以涵盖这一点。谢谢。
2011年


当您在问题中进行编辑时。看看他们如何使用http进行操作。我不知道使用魔术数字是否是个好主意。但是,如果您真的愿意这样做,请遵循他们的概念。例如,它们具有错误分类法(您有吗?)。
wleao

@wleao-还没有,但是要感谢您和PéterTörök,我一定会创造一个。:)
ahodder 2011年

Answers:


16

没有。

错误代码是不合时宜的,它们源于过去的日子,当时的输出确实非常困难且昂贵,并且指示错误情况的唯一方法可能是通过一堆前面板灯: pdp11 / 70前面板

如今,几乎每种主流语言都内置了成熟的异常处理功能。用它。向用户提供可以使用的信息;不要用技术之类的东西打扰他们,而要大致告诉他们出了什么问题以及他们可以怎么做。对于日志记录,只需给您的例外提供描述性名称,然后记录该名称。使用grep或类似的搜索工具更容易记住,也更容易找到。

当然,例外是,当您针对输出仍然困难且昂贵的情况(例如嵌入式系统或网络协议)进行编程时。HTTP仍然使用数字响应代码,因为它们非常容易有效地解析-在某些情况下,仅读取第一个数字已经可以告诉您足够的信息,而您可以丢弃其余的数据包。


感谢您提供详细的答案,这很有意义并且很高兴知道。
2011年

您对插图的使用完全符合您的论点。我已经读过有关PDP-11的文章。但这实际上是我见过的第一个。谢谢。
Mike Owens

2
在代码内部,我宁愿处理一个错误代码,而且我还不算老。
JeffO

@Jeff:您可以使用错误代码执行的任何操作也可以使用异常完成,然后再执行其他操作。如果您想模仿带有异常的错误代码,您要做的就是抛出而不是返回错误代码,并捕获而不是将返回值与E_OK(或任何OK响应)进行比较。公平地说,C没有真正的例外,而且长跳转也不那么方便,因此,如果您使用C,您会有所宽恕。
tdammers

@Mike:图片来自PDP-11系列的维基百科文章;如果那不容易找到,我不知道是什么。
tdammers

6

您应该查看如何在常见协议(例如HTTP)中组织错误/状态代码。它们为不同类型的状态/错误保留不同的范围。这不仅使用户更容易识别未知状态代码,而且使开发人员可以为以前从未处理过的新型错误分配代码。


添加到您的答案分类法的事情。这将使事情更容易管理和维护错误。
wleao 2011年

3

抱歉,为什么还要使用错误代码?
捕获异常,将其记录下来,并在程序无法恢复时主动发送报告。

(假设您的语言支持例外。)

唯一可能帮助您修复错误的相关信息是堆栈跟踪,您不会通过错误代码获得该跟踪。(我还假设您要对错误报告使用错误代码,而不是将其丢给用户。)


的确如此,我会告诉用户什么?我敢肯定,如果他们兜售,并且应用程序只是死掉,没有任何解释或任何发怒的内容,他们将为之兴奋。
2011年

6
我认为至少有三件事在这里变得混乱。第一个是从软件到软件的代码,例如HTTP。第二个是用户可以在错误报告中使用的代码(例如事件编号)。最后是可以显示给用户的消息。将它们视为独立的东西可能会有所帮助。
达里安

2
使用错误代码的一个重要原因是在构建后端应用程序时。对于客户端程序而言,解释和响应代码比对错误消息或堆栈跟踪要容易得多,也更加优雅。并非所有错误均来自错误。
Kaypro II

1
异常很难纠正!请参阅以下链接:programmers.stackexchange.com/questions/97874/…–
编码器

@Coder:您的示例滥用异常。您应该抓住将要抛出的东西。大多数方法不需要期望会抛出单个异常。决定要处理什么完全是程序员的责任,我同意可能很难正确处理

2

我将假定一个过程上下文(C)。如果有对象,则无论是否有异常,错误对象通常会更好。

您应该使用每个模块本地的错误代码。对于库,您可以使用一个特殊的标头列出错误代码,错误代码的编号为1、2等(或者,如果愿意,则为-1,-2)。确保始终返回这些代码之一,例如,翻译errno成您自己的代码。如果您有多个模块层,请在每个步骤进行转换(或为更深层次的错误预定义一个范围,例如,值1001-1050来自该其他模块)。

提供将代码转换为字符串的方法也很重要。您永远不要只报告代码,这只会导致挫败感。实际上,应用程序中的几乎所有代码都应该带有字符串转换功能。例如,libc通常具有strerrorand strsignal,但遗憾的是缺少strwaitstatus


奇妙的细节,谢谢。这实际上是很有帮助的。
ahodder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.