有关在C#中构建错误代码的建议

时间:2011-05-17 16:54:05

标签: c# edsdk

我是C#的新手,如果我的一些概念偏斜,请原谅我。我正在使用Canon EDSDK,为了让生活更轻松,我希望能够将错误消息看作文本而不是十六进制值。 EDSDK.cs文件包含一长串错误,例如:

public const uint EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07;
public const uint EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08;

理想情况下,我想将所有这些放入某种查找表中,这样我就可以输入一个HEX错误代码并将实际的消息作为字符串返回。例如

Hashtable EDSDKErrorCodes = new Hashtable();

EDSDKErrorCodes.Add("0x00008D01", "EDS_ERR_TAKE_PICTURE_AF_NG");
EDSDKErrorCodes.Add("0x00008D08", "EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG");
etc etc...

我的代码中的后者我可以抓取从其中一个EDSDK方法返回的错误消息,并以人类可读的形式显示它:

errorcode= EDSDK.EdsInitializeSDK();

MessageBox.Show(Convert.ToString(EDSDKErrorCodes[errorcode]));

我的问题是..这是处理所有这些错误代码的好方法,还是人们会推荐更好更有效的方法?如果是这样,我如何将哈希表填充为一系列常量而不必使用Add方法?

6 个答案:

答案 0 :(得分:14)

另一种方法是通过创建带有描述属性的枚举。有关详细信息,请参阅here。这总结了它的外观:

public enum ErrorCodes : uint
{
    [Description("Description for EDS_ERR_TAKE_PICTURE_CARD_NG")]
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    [Description("Description for EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG")]
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

最简单的是,如果您不关心描述,可以使用Enum.GetName

将枚举名称转换为字符串

答案 1 :(得分:6)

你可以使用枚举。

public enum ErrorCodes : uint
{
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

然后您的用法可能如下所示:

ErrorCodes error = (ErrorCodes)EDSDK.EdsInitializeSDK();
MessageBox.Show(Enum.GetName(typeof(ErrorCodes), error));

答案 2 :(得分:3)

我认为制作一个枚举会更优秀:

public enum CanonErrorCode
{
    SomeErrorDescription = 14,
    SomeOtherErrorDescription = 15
    // .. etc
}

您只需将十六进制转换为整数即可。然后你可以简单地这样称呼它:

// Samples
var myErrorCode = (CanonErrorCode)someIntegerValue;
var myErrorCode = CanonErrorCode.SomeOtherErrorDescription;

如果你想要人工格式化的错误描述,那么我会建议某种映射,如:

static Dictionary<int, string> errorlookups = new Dictionary<int, string>();

errorLookups.Add(10, "This is the human readable error message.");
errorLookups.Add(17, "Create this guy once in a static constructor.");

答案 3 :(得分:2)

您可以使用通用词典而不是哈希表

Dictionary<uint, String> myDict = new Dictionary<uint, String>();

然后,您可以通过执行

来检索所需的值
MessageBox.Show(myDict[errorCode]);

对于添加,我认为您可以使用反射做一些事情来反映EDSDK类并找到所有常量uint成员。然后遍历该列表,添加值和常量名称。

答案 4 :(得分:2)

好的,自从我们开始滚动后的又一次采取:-)
如果未定义当前错误代码,此解决方案还会生成人类可读的错误字符串。

像这样创建Enum

public enum ErrorCode : uint
{
    EDS_ERR_TAKE_PICTURE_CARD_NG = 0x00008D07,
    EDS_ERR_TAKE_PICTURE_CARD_PROTECT_NG = 0x00008D08
}

然后,为枚举类型创建一个Extension Method,如下所示:

public static class ErrorHandler
{
    public static string ToErrorString(this ErrorCode errorCode)
    {
        return Enum.IsDefined(typeof(ErrorCode), errorCode) ? 
            errorCode.ToString() : "Undefined error code";
    }
}

最后,像这样使用它:

var errorCode = (ErrorCode)EDSDK.EdsInitializeSDK();
MessageBox.Show(errorCode.ToErrorString());

答案 5 :(得分:0)

首先,您应该使用通用字典而不是哈希表。其次,我对佳能EDSDK一无所知,但看起来奇怪的是,它将错误代码作为十六进制字符串返回,而不仅仅是定义常量的uint。这真的是他们被归还的方式吗?如果是这样,那很奇怪,但你应该能够将它们转换为整数,否则你可以跳过这一步。

如果要使用反射创建数组,可以执行以下操作:

Dictionary<int,String> EDSDKErrorCodes = new Dictionary<int,String>;
System.Reflection.FieldInfo[] fields = typeof(EDSDK).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
foreach (System.Reflection.FieldInfo field in fields) {
  EDSDKErrorCodes[(uint)field.GetValue(null)] = field.Name;
}

然后您可以使用以下方式访问它:

MessageBox.Show(EDSDKErrorCodes[errorCode]);

如果errorCode是一个字符串,请先使用以下命令转换它:

uint errorNumber = uint.Parse(errorCode.Substring(2), System.Globalization.NumberStyle.HexNumber);