2010-05-08 34 views
17

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

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

+1

有趣的问题+1 – 2010-05-08 02:42:33

回答

14

WITHIN一个程序应该总是使用异常而不是错误代码。但是,异常不能传播到程序之外。任何时候错误都必须离开程序,并留下错误信息或错误代码。

对于简单的事情,将永远是人为操作的错误消息没有代码是好的。你可以说“没有找到文件”而不给它一个错误代码。但是,如果它可能是另一端的另一台计算机,则应另外给出错误代码。当您将其更改为“未找到文件<x>”时,您不想打破其他系统。

+0

恰好说过。 +1给你! – David 2010-05-08 13:09:29

+1

异常可能会作为错误传播出Web服务,因此您的声明不准确。 – 2010-05-08 13:50:44

+1

@约翰作为一个泛化它是相当准确的。 – 2010-05-08 19:44:13

2

错误代码是老派。他们根本没有价值。

错误代码唯一可能的值是它可以识别一个非常特定的情况。您可以为代码库中的每个点添加一个可以抛出异常的代码。这将使您能够非常精确地缩小问题的严重程度。

但是没有人关心这个详细程度。谁想要维持这样的混乱。它会给你留下类似“由于状态S而导致的条件A和B但不是C”的代码。试图弄清楚这到底意味着什么,而不是努力工作。堆栈跟踪将更有价值地告诉你程序中发生问题的位置。

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

+2

例外有没有困难,在所有携带的细节。当错误代码合适时,调用者可能合理地询问“XYZ是否可能?”,例如“是否有可能将此字符串解析为DateTime?”。在这种情况下,例外情况不是报告失败的好方法。当直接调用者处理故障时,错误代码是最好且最快的。请记住,将错误代码转换为异常比反过来更便宜。 – 2010-05-08 02:52:18

+0

例如'TryParse'返回的错误代码不是错误代码的好例子。这只是真的/假的。没有必要为方法失败的每个可能原因分配一个单独的错误代码。 – 2010-05-08 13:49:32

+0

-1。故障/异常本身可能包含错误代码。 “错误代码”可能不仅仅是直接的方法返回。 – 2010-05-08 19:16:06

9

我不认为我曾经用在.net中的错误代码,除非一个情况 - 当我创造,我知道将要被从其他应用程序称为一个控制台应用程序。这个其他的应用程序必须知道控制台应用程序何时失败,以及出了什么问题。所以,一个适当的例子是,当你知道你的程序将被其他程序调用,并且你想要一个结构化的方式来让他们理解错误。

这就是说,我当时是.NET的新手,并且从未使用错误代码。

作为一个侧面说明,作为一个Windows用户,能够在错误代码中填充并提供知识库文章是很好的,所以错误代码与良好的文档和找到它的能力相结合=好的感觉来自您的用户。

4

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

我也用它们为应用程序创建“错误报告”框架。当抛出异常时,它们被抛出一个错误代码,当异常冒出时,它被发送(通过日志)到中央服务器。该代码帮助组织数据库,以便我们可以检查与特定错误相关的日志。

最后,在其他几个答案中提到,错误代码是容易和语言无关的谷歌(认为Windows错误代码/ MS KB文章),这样的错误代码的什么地方出了错可能是一个描述更适合技术产品的最终用户。

错误代码的想法是有用的,但IMO它们属于异常成员或作为IErrorReporter接口的参数或更多东西而不是方法返回值。

+0

+1用于存储错误代码作为异常成员以及“错误报告”框架的想法。我接受了Loren的回答,因为他更适合使用错误代码进行定义。这个答案很好地描述了如何最好地使用和实现错误代码。 – 2010-05-09 20:36:46

7

Web服务界面非常普遍。返回带描述的代码非常简单且标准。

我同意大多数情况下的是老派

我会说这是代码的质量最大的缺点。您必须添加更复杂的逻辑来管理错误代码,而不必使用方法参数或返回值就会发生异常。

您还必须添加一个“IF”来检查返回的代码是否成功,而异常直接发送到错误处理块。

2

C#和可能Java也支持更好的异常处理控制流,finally关键字,这使得事情比使用错误代码更好一点。一个异常对象可以包含任何级别的细节,当然远不止一个错误代码。因此,异常对象更实用,但是您可能遇到一个不常见的情况,其中错误代码会更合适。

FWIW,C++也支持异常对象。我不认为C++支持finally关键字(虽然可能更新的C++ whatevers),但在C++中,您还必须避免在catch处理程序中返回等内容。

5

我是一个新手,堆栈溢出,但...

我相信,错误代码往往使用或处理需要各种各样的最终用户错误的情况下非常有用涉足到整顿情况。如果您的代码要由其他开发人员维护,那么异常就是要走的路。然而,在一个情况下有一个问题:

  • 环境

    您的应用程序正在运行

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

  • ,一个设备或设备驱动程序指示(硬件故障也许?)

然后错误代码可能是有意义的。例如,如果您的应用程序试图代表最终用户登录数据库,但数据库无法进行身份验证(数据库脱机,电缆被拔出),则错误代码/说明组合可能有助于终端用户访问数据库,用户解决问题。

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

希望这有助于...

--jqpdev

0

我已经写了由其他(远程)应用程序占用很多的网络服务。当请求发生严重错误时,客户或多或少地坚持要获取代码,以便他们不必进行可怕的字符串比较以找出错误。

采取HTTP结果代码为这样的行为的一个很好的例子。 “200”意味着快乐,“300”可以任何一种方式,“400”或“500”意味着开始疯狂。

+0

您的客户不处理SOAP故障?有趣。 – 2010-05-08 13:51:51

+0

很多这些现有的服务都不使用SOAP,并且早于我到公司的时间。我只是尽我所能去做的事。 – WineSoaked 2010-05-08 17:05:49

1

错误代码被设计在这样一个时代,一个函数告诉出事了来电者的唯一途径是特殊的意义分配给其中的一个或多个值可以返回,并非常频繁只本地整数左右可用于返回该特殊值。

例如,在C“得到字符”例行程序返回的下一个字符的ASCII值,但返回如果由于某种原因出现了问题负值。然后,您负责以某种方式返回给您的主叫方,以便可以处理此错误情况,并且必须返回等。

异常机制是处理此问题的优雅方法“这是一个紧急情况,我们必须从直到能够解决问题为止“。错误代码不如此。

0

错误代码是,如果你想将它们发送给用户。如果不是,请使用例外。

+1

这不是非常用户友好,请参阅上面的罗兰的答案。 代码应该喂给其他系统,人应该与自然语言描述,而不是... “WTF是错误666?听起来不好,但我不知道它是什么意思” – crowne 2010-05-08 18:55:30

+0

你可以做到两个 - 开始一个错误代码,然后给出文本说明:错误404 - 页面未找到。 – 2010-05-09 02:26:07

+0

用户更容易记住错误666 - 特别是如果这些代码是跨语言的。如果您给出了自然语言描述,则必须将其翻译成六万亿种语言,并且当您获取它们时,您仍然不确定wtf是否出错。 – Puppy 2010-05-09 12:42:32