2009-07-12 6 views
1

Je veux créer un tas d'erreurs. chacun spécifique à sa propre classe et module. Ensuite, je voudrais attacher l'id à une exception alors quand mon msg change l'identifiant est toujours le même. Comment puis-je créer cette liste d'erreurs sans maintenir une grande énumération globale?Comment créer un ID d'erreur unique global? C#

Répondre

9

Diviser le nombre hexadécimal 32 bits non signé couvre comme une hiérarchie:

0xMMCCCEEE 

où:

  • MM est le module ID
  • CCC est l'ID de classe
  • EEE est erreur ID

Ensuite, vous pouvez avoir 0 à 0xFF (256) modules, et 0 à 0xFFF (4096) chacune des classes et des erreurs, et vous devez seulement vous assurer que chaque erreur est unique à sa classe, et chaque classe est unique à son module, vous ne devez pas Je dois garder tous les messages d'erreur dans une seule table géante.

Exemple:

0x0401D00A 

C'est le module 04, classe 01D, 00A d'erreur.

+0

Je pense que j'aime ça :) –

+0

Pourquoi voudriez-vous attribuer des identifiants uniques aux messages d'erreur si vous n'allez pas garder tous les messages d'erreur dans une seule table géante? –

4

Générez un GUID pour chaque erreur.

1

Quel est le but d'avoir un identifiant unique pour chaque erreur? Toute exception que votre code lance déjà contient des informations qui l'identifient de manière unique, c'est-à-dire le type d'exception et le nom du module et la ligne de code qui l'a lancé. Vous n'avez pas besoin d'attribuer un ID à une exception pour savoir que ce n'est pas la même exception qu'une exception avec un type, un module ou une ligne différent. En règle générale, la nécessité d'attribuer un ID unique à une entité découle du besoin de conserver d'autres informations sur cette entité dans un type de stockage durable. Quelles sont les caractéristiques de ce magasin durable? Ces exigences vont presque certainement servir de base à l'évaluation de l'adéquation de tout système d'identification particulier que vous avez conçu. Que sont-ils?

+0

La raison la plus courante est que les erreurs peuvent être citées en communication avec les utilisateurs, tech. dossiers de soutien, etc. IBM a suivi cette approche religieusement pendant des décennies. –

+0

La réduction d'un élément d'information long-ish en un identificateur court a une valeur qui peut être mesurée assez facilement en comparant l'espace requis par les deux descriptions. C'est pourquoi http://tinyurl.com/ existe. –

+0

Vous commencez à apprécier quand vous avez votre application localisée dans une douzaine de langues différentes. Supposons qu'un client chinois vous envoie un rapport de bogue avec la capture d'écran ci-jointe d'un message d'erreur - en chinois, naturellement. S'il a un code d'erreur, il suffit de le rechercher et de savoir de quoi il s'agit. Si ce n'est pas le cas, vous devez trouver quelqu'un qui connaît le chinois ... –

0

Il est naïf de pouvoir attribuer un "point d'erreur" à chaque "erreur" possible. Prenons un exemple simple, où une méthode renvoie une erreur particulière (je serai courtois et dire « jette », mais dans le contexte, il a utilisé des « retours »):

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

Peut-être que cette méthode est appelée uniquement d'un endroit dans la version 1. Cela signifie qu'il est possible dans cette version de documenter que le code d'erreur MyMethodError1 signifie une chose particulière.

Dans la prochaine version, la méthode s'avère utile, elle est donc appelée à partir de trois endroits. En fait, il est appelé à partir de deux chemins de code différents dans l'un des endroits. MyMethodError1 signifie-t-il la même chose qu'auparavant? Je dis que non. Uniquement en tenant compte des circonstances des appels, tels que déterminés par la pile d'appels, pouvez-vous déterminer la signification de l'exception particulière?

Un code d'erreur n'aide pas avec ça.

Questions connexes