如何创建全局唯一的错误标识?C#

3
我想创建一系列错误,每个错误都特定于它自己的类和模块。然后我想将 ID 附加到异常中,以便当我的消息更改时 ID 仍然保持不变。我如何创建此错误列表而无需维护一个大型全局枚举?
5个回答

11

将无符号32位十六进制数范围分层:

0xMMCCCEEE

其中:

  • MM是模块ID
  • CCC是类ID
  • EEE是错误ID

因此,您可以拥有0到0xFF(256)个模块,每个类和错误都可以拥有0到0xFFF(4096),您只需要确保每个错误对其类别唯一,每个类别对其模块唯一,这样就不必将所有错误消息保存在单个巨大的表中。

例如:

0x0401D00A

那是模块04,课程01D,错误00A。

1
如果您不打算将所有错误消息保存在一个巨大的表中,为什么会关心为错误消息分配唯一标识符呢? - Robert Rossney

7
生成每个错误的GUID。

1
Guid.CreateGuid();

1
每个错误都有一个唯一标识符的目的是什么?您的代码引发的任何异常已经具有唯一标识它的信息,即异常类型和抛出它的模块名称和代码行。 您不需要为异常分配ID以知道它与具有不同类型或模块或行的另一个异常不同。
一般来说,需要为实体分配唯一ID的原因是需要将有关该实体的其他信息保存在某种持久存储中。 该持久存储的特征是什么?这些要求几乎肯定是评估您提出的任何特定ID方案适用性的基础。 它们是什么?

3
最常见的原因是为了在与用户、技术支持记录等沟通中能够引用错误信息。IBM几十年来一直坚守这种做法。 - Daniel Earwicker
1
将一段较长的信息折叠成一个简短的标识符,通过比较两个描述所需的空间,可以很容易地衡量其价值。这就是为什么存在http://tinyurl.com/。 - Daniel Earwicker
1
当你将应用程序本地化成十几种不同的语言时,你会开始感激它。假设一个中国客户给你发送了一个带有错误消息框截图的错误报告 - 当然是用中文。如果它有一个错误代码,你只需要查找一下就知道是什么问题。如果没有错误代码,你就必须找到一个懂中文的人... - Pavel Minaev
没错,我并不怀疑需要某种形式的标识方案。我想说的是,在原帖作者特定的背景下,一些具体的标识符使用案例将有助于确定最佳方案可能是什么。如果没有这些案例,很难判断哪种方法比另一种更好。 - Robert Rossney

0

认为每个可能的“错误”都可以在“错误空间”中被分配一个点是一种天真的想法。考虑一个简单的例子,一个方法抛出一个特定的错误(我会礼貌地说“抛出”,尽管在上下文中,它曾经是“返回”):

public void MyMethod() {
    // ...
    throw new ErrorException(ErrorCodes.MyMethodError1); // Or something
}

也许这个方法只在 Release 1 中的一个地方被调用。这意味着在该版本中可以记录错误代码 MyMethodError1 代表特定含义。
在下一个版本中,这个方法被发现很有用,所以从三个地方调用它。事实上,在其中一个地方,它是从两个不同的代码路径调用的。现在 MyMethodError1 的含义和以前一样吗?我认为不是。
只有考虑到调用的情况,如调用堆栈所确定的,才能确定特定异常的含义。错误代码对此没有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接