在C#中为企业项目创建错误代码模式的最佳实践


43

我正在研究一个将在许多SMB和企业中部署的企业项目。
对这个项目的支持会很艰难,因此我想为错误创建一个编码模式(例如HTTP status Codes)。这将使服务台人员能够查阅文档并尽快解决问题。

有哪些最佳实践和建议?
这样做的任何帮助将非常有用。


1
对于这种格式,可能答案太多,或者好的答案太长。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。到目前为止,您尝试了什么。
Ben McDougall

取决于您的业务结构。在C#中,我们总是让用户可以向我们发送StackTrace或从错误消息详细信息中复制/粘贴它(我们没有严格的安全要求)。
猎鹰

Answers:


69

错误代码和错误返回值之间存在差异。错误代码适用于用户和服务台。错误返回值是一种编码技术,用于指示您的代码遇到错误。

可以使用错误返回值实现错误代码,但我建议不要这样做。异常是报告错误的现代方法,没有任何理由不应该在其中携带错误代码。

这就是我的组织方式(请注意,第2-6点与语言无关):

  1. 使用具有附加ErrorCode属性的自定义异常类型。主循环中的catch将以通常的方式报告此字段(日志文件/错误弹出窗口/错误回复)。在所有代码中使用相同的异常类型。
  2. 不要从1开始,也不要使用前导零。保持所有错误代码的长度相同,因此很容易发现错误的错误代码。通常从1000开始就足够了。也许添加一个前导“ E”以使用户可以清楚地识别它们(在支持台必须指示用户如何发现错误代码时特别有用)。
  3. 保留所有错误代码的列表,但不要在代码中执行此操作。在开发人员的Wiki页面上保留简短列表,供开发人员在需要新代码时轻松进行编辑。服务台应在自己的Wiki上有一个单独的列表。
  4. 不要尝试对错误代码强制执行结构。总是会有难以分类的错误,您不想花数小时来讨论错误应该属于45xx组还是属于54xx组。务实
  5. 在代码中为每个抛出分配一个单独的代码。即使您认为是同一原因,帮助台在不同情况下也可能需要做不同的事情。对于他们来说,在他们的Wiki中拥有“ E1234:请参见E1235”要比让用户承认自己做错了要容易得多。
  6. 如果服务台要求,请分割错误代码。if (...) throw new FooException(1234, ".."); else throw new FooException(1235, "..");您的代码中简单的一行可能会为帮助台节省半小时。

而且永远不要忘记,错误代码的目的是使服务台的工作更轻松


我从来没有亲自做过,但是经常会看到“相关ID”,特定于错误实例的向导会显示给用户并记录下来。这样,与大约时间和错误代码相比,您可以更轻松地在日志中找到确切的错误发生。
xdhmoore

我想可能有一种在相关ID中包含错误代码的方法,这样它就可以用作帮助台的人类可读错误代码,并可以作为开发人员的错误实例ID。
xdhmoore

我的模式很相似。但是我没有添加“ E”,而是添加了简短的应用程序部分。我们的文档框架有一段Doc1234时间,例如Main-App可以拥有IrS1234。因此,我的服务台同事非常快地为用户提供帮助。
Matthias Burger

6

您首先必须隔离可能发生错误并且对用户可见的区域。然后,您可以记录它们。就这么简单。

好吧,从理论上讲是简单的。在实践中,错误可能会在该死的地方发生,并且报告错误可以将漂亮的代码变成记录,异常抛出和处理以及传递返回值的庞然大物。

我会建议采用两步法。首先是记录,记录很多。

其次是确定主要组件及其接口,并定义这些组件可以发现哪些主要错误情况。然后,当这些错误之一(内部如何处理错误取决于您)时,您可以以更直观的方式登录。 -异常或错误代码在这里没有区别)。然后,用户通常会看到该错误并转到日志以获取更多详细信息。

Web服务器和您的http错误代码示例使用相同的方法。如果用户看到404并将其报告为支持,则他们将在日志中查找正在发生的事情,访问的页面,时间的详细信息,并将从任何其他有意义的地方收集其他信息,位于DB,网络或应用程序中。


3

我将使用具有描述性名称的自定义异常并清除消息并将其抛出。使用语言的现有异常基础结构要比建立对传递错误代码和解释错误代码的支持要容易得多。


1
我将不胜感激,将这个答案从1降低到0,至少可以给出一个理由...
Stefan Billiet

1
我不是在投票(不是很重要,克服它),但是我认为该语言也支持返回值。
gbjbaanb

2
这对我很重要;如果我错了,我想知道,以便我可以学习:-p你是什么意思,对返回值的现有支持?您是否不必编写管道以区分正常返回值和错误代码?在系统边界将异常转换为错误代码是一回事,但是通常建议不要将它们混入系统中。我相信实用程序员会提到这类内容。
Stefan Billiet

1
在每种情况下,异常并不是一个好的机制,但是如果您决定使用错误,则可以为每个调用添加out参数,或者让重要的调用全部返回代码。只需预先决定要这样做,您就可以做到。实用上,您最终会混合使用这两种方法-在边界处返回错误代码(因此您不会被锁定为单一语言),并在内部使用异常。
gbjbaanb

6
我没有否决您的想法(请放心,否则每个人都必须重复此步骤:)。如果您曾在服务台工作或致电过,那么仅传达一个简短的电话号码比发送一条错误消息要容易得多。口头交流时,保证会更改一条错误消息。
Codism
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.