什么时候使用错误代码?

在支持exception对象(Java,C#)的语言中,何时使用错误代码是合适的? 在典型的企业应用程序中,错误代码的使用是否合适?

许多众所周知的软件系统使用错误代码(以及相应的错误代码引用)。 一些示例包括操作系统(Windows),数据库(Oracle,DB2)和中间件产品(WebLogic,WebSphere)。 错误代码提供哪些好处? 使用错误代码有什么缺点?

在程序中,应始终使用exception而不是错误代码。 但是,exception不能传播到程序之外。 每当错误必须离开程序时,您将收到错误消息或错误代码。

对于简单的事情,总是人为操作的错误消息没有代码是好的。 如果没有给出错误代码,您可以说“找不到文件”。 但是,如果它可能是另一端的另一台计算机,那么您应该另外提供错误代码。 当您将其更改为“未找到文件”时,您不希望破坏其他系统。

我不认为我曾经在.Net中使用过错误代码,除非在一种情况下 – 当我创建一个我知道将从另一个应用程序调用的控制台应用程序时。 这个其他应用程序必须知道控制台应用程序何时失败,以及出了什么问题。 因此,当你知道你的程序将被其他程序调用时,你需要一种结构化的方式让他们理解错误。

也就是说,我当时是.NET的新手,从那时起就从未使用过错误代码。

作为一个侧面说明,作为一个Windows的人,很高兴能够填写错误代码并提出一篇知识库文章,所以错误代码结合良好的文档和找到它的能力=来自用户的好感觉。

Web服务接口很常见。 返回带有描述的代码非常简单和标准。

我同意,大多数情况都是旧学校

我说最大的缺点就是代码的质量。 您必须添加更复杂的逻辑来管理错误代码,同时冒泡exception而不必使用方法参数或返回值。

您还必须添加“IF”以检查返回的代码是否为SUCCESS,而exception直接转到error handling块。

我是堆叠溢出的新手,但……

我认为错误代码倾向于用于处理错误情况,这些错误情况需要最终用户参与纠正某种情况。 如果您的代码由另一个开发人员维护,则exception是可行的方法。 但是,在出现问题的情况下:

  • 在应用程序运行的环境中

  • 与您的应用程序和其他实体(Web服务器,数据库,套接字等)之间的通信

  • 设备或设备驱动程序指示(可能是硬件故障?)

然后错误代码可能有意义。 例如,如果您的应用程序试图代表您的最终用户登录数据库,但是数据库无法进行身份validation(数据库脱机,电缆已拔下),则错误代码/描述组合可能有助于结束 – 用户纠正问题。

再次在开发人员/工程师级别,他们将能够触摸源代码(传统的调试和测试技术)并对其进行修改,使用exception。

希望这可以帮助…

–jqpdev

当需要将错误传达给用户时,我经常使用错误代码,因为它们可以被国际化。 例如,在编译器中,如果用户代码中存在错误,则可以在编译器后端发出错误信号,而前端可以将它们本地化为特定于文化/语言的字符串以供用户使用。 但是,为了这个目的,枚举可能比原始整数更好。

我还使用它们为应用程序创建“错误报告”框架。 抛出exception时,会抛出错误代码,当exception冒泡时,会将错误代码(带有日志)发送到中央服务器。 代码帮助组织数据库,以便我们可以检查与特定错误相关的日志。

最后,正如其他几个答案中所提到的,错误代码很容易与谷歌语言无关(想想Windows错误代码/ MS知识库文章),因此错误代码错误描述可能对最终用户更好技术产品。

错误代码的想法很有用,但IMO它们作为exception成员或作为IErrorReporter接口的参数或者比作为方法返回值更多的东西。

错误代码是老派。 它们几乎没有任何价值。

错误代码唯一可能的值是它可以识别非常特定的情况。 您可以为代码库中的每个点生成一个可以抛出exception的代码。 这将使您能够非常准确地缩小问题的范围。

但没有人关心这种细节。 谁想要保持如此混乱。 它将为您留下代码,这些代码意味着“条件A和B,但由于状态S而不是C”。 尝试弄清楚这意味着什么,这比努力更值得努力。 堆栈跟踪在告诉您程序中问题发生的位置时更有价值。

在exception是一种普遍的技术之前,我学会了编程计算机。 我很高兴我们得到了例外!

C#,也可能是Java,支持更好的exception处理控制流,即finally关键字,它使事情比使用错误代码更好。 exception对象可以包含任何级别的详细信息,当然不仅仅是错误代码。 因此exception对象更实用,但是您可能会遇到一种不常见的情况,即错误代码更合适。

FWIW,C ++也支持exception对象。 我不认为C ++支持finally关键字(虽然可能是更新的C ++ whatevers),但在C ++中你还必须避免像在catch处理程序中返回一样。

错误代码是在一个时代设计的,其中函数告诉调用者出错的唯一方法是为可以返回的那些值的一个或多个值分配特殊含义,并且通常只有一个本机整数左右可用于返回该特殊值。

例如,在C中,“get character”例程返回ASCII中的下一个字符值,但如果由于某种原因出错则返回负值。 然后,您负责以某种方式返回给您的调用者,以便可以处理此错误情况,并且必须返回等。

exception机制是一种处理这种情况的优雅方式“这是一种紧急情况,我们必须从代码返回,直到可以处理问题”。 错误代码不如此。

我编写了许多其他(远程)应用程序使用的Web服务。 当一个请求出现问题时,客户或多或少会坚持要求获取代码,这样他们就不必进行一些可怕的字符串比较来找出问题所在。

将HTTP结果代码作为此类行为的一个很好的示例。 “200”意味着快乐,“300”意味着任何一种方式,“400”或“500”意味着开始吓坏了。

错误代码适用于您要将其发送给用户的情况。 如果没有,请使用例外。