2010-09-29 16 views
3

J'écris une application C# .NET 2.0 dans laquelle un message devrait être reçu via le SerialPort. Si la trame n'est pas reçue (c'est-à-dire expire) ou si elle est jugée invalide, j'ai besoin de définir un code d'erreur en utilisant SetLastError. Windows a une pléthore de codes d'erreur. Y at-il un outil ou une référence simple pour aider à affiner le code d'erreur approprié à utiliser?Comment puis-je rechercher le code d'erreur système Windows approprié à utiliser dans mon application?

PLUS D'INFO

en lançant une exception et la manipulation plus haut dans la pile est ma préférence, ce n'est pas une option dans ce cas parce que la demande, je mise à jour n'a pas été conçu pour tirer parti de une fonctionnalité si utile.

+1

Pourquoi avez-vous besoin d'appeler ' SetLastError'? – SLaks

+0

@SLaks: Je veux utiliser 'SetLastError' car plus haut il y a une fonctionnalité pour enregistrer les erreurs dans un fichier texte, ce qui vaut mieux que rien, je suppose. –

Répondre

0

dans le « bon vieux temps "(C et C++), la liste des erreurs Windows possibles a été définie dans winerror.h

MISE À JOUR: Le lien ci-dessous est mort. Vous ne savez pas si le fichier est toujours disponible en téléchargement, mais vous pouvez trouver tous les Windows System Error Code definitions sur ce lien.

Ce fichier peut être trouvé sur Microsoft's site (bien qu'il me surprenne un peu qu'il soit daté aussi loin que 2003 - pourrait valoir la peine d'être recherché pour une version plus récente).

Mais si vous obtenez (ou souhaitez définir) des codes d'erreur Win32, ce sera là où la définition est trouvée.

+0

Je réalise que c'est une vieille question, mais voici une liste à jour montrant la hiérarchie des erreurs: http: // msdn.microsoft.com/en-us/library/z4c5tckx.aspx –

0

Vous pouvez trouver une liste de tous ici:

http://en.kioskea.net/faq/2347-error-codes-in-windows

Ensuite, il suffit de faire une recherche pour « série » et l'utilisation selon correspond le mieux à votre erreur

+0

Merci pour le lien, mais le site MSDN montre que les codes d'erreur vont jusqu'à 15,999. http://msdn.microsoft.com/en-us/library/ms681381%28VS.85%29.aspx –

2
using System.Runtime.InteropServices;  // DllImport 

public static string GetSystemMessage(int errorCode) { 
int capacity = 512; 
int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; 
StringBuilder sb = new StringBuilder(capacity); 
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, IntPtr.Zero, errorCode, 0, 
    sb, sb.Capacity, IntPtr.Zero); 
int i = sb.Length; 
if (i>0 && sb[i - 1] == 10) i--; 
if (i>0 && sb[i - 1] == 13) i--; 
sb.Length = i; 
return sb.ToString(); 
} 

[DllImport("kernel32.dll")] 
public static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, 
    int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr Arguments); 
3

Malheureusement ce qui précède n'a pas fonctionné pour moi, mais cela a parfaitement fonctionné pour moi, coller tout le code peut donc être une copie collée directement en C#

public static class WinErrors 
{ 
    /// <summary> 
    /// Gets a user friendly string message for a system error code 
    /// </summary> 
    /// <param name="errorCode">System error code</param> 
    /// <returns>Error string</returns> 
    public static string GetSystemMessage(uint errorCode) 
    { 
     var exception = new Win32Exception((int)errorCode); 
     return exception.Message; 
    } 
}