如何创建全局唯一错误ID? C#

时间:2009-07-12 08:34:53

标签: c#

我想创建一堆错误。每个都特定于自己的类和模块。然后我想将id附加到异常,所以当我的msg改变时,id仍然是相同的。如何在不维护大型全局枚举的情况下创建此错误列表?

5 个答案:

答案 0 :(得分:9)

将无符号32位十六进制数字范围除以层次结构:

0xMMCCCEEE

其中:

  • MM是模块ID
  • CCC是班级ID
  • EEE是错误ID

然后你可以有0到0xFF(256)个模块,每个类和错误都有0到0xFFF(4096),你只需要确保每个错误对于它的类是唯一的,并且每个类都是唯一的模块,因此您不必将所有错误消息保存在一个巨大的表中。

示例:

0x0401D00A

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

答案 1 :(得分:4)

为每个错误生成GUID。

答案 2 :(得分:1)

为每个错误设置唯一标识符的目的是什么?您的代码抛出的任何异常都具有唯一标识它的信息,即异常的类型以及抛出它的模块名称和代码行。您不需要为异常分配ID,以便知道它与具有不同类型,模块或行的异常不同。

一般而言,为实体分配唯一ID的需要源于需要将关于该实体的其他信息保存在某种耐用存储中。耐用商店的特点是什么?这些要求几乎肯定会为评估您提出的任何特定ID方案的适用性提供基础。它们是什么?

答案 3 :(得分:0)

Guid.CreateGuid();

答案 4 :(得分:0)

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

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

也许这个方法只从版本1中的一个地方调用。这意味着在该版本中可以记录错误代码MyMethodError1意味着特定的东西。

在下一个版本中,发现该方法很有用,因此从三个地方调用它。事实上,它是从其中一个地方的两个不同的代码路径调用的。 MyMethodError1现在和以前一样意味着什么?我说它没有。

只有通过考虑调用堆栈确定的调用情况,才能确定特定异常的含义。错误代码对此没有帮助。