用户定义的Visual C#中的错误集合

时间:2010-11-10 07:21:14

标签: c# dll error-handling

我想写一个用户定义的错误集合类,它应该收集所有的错误。当我们验证实体对象时,如果没有错误,它应该去并保存到数据库。如果错误那里它应该显示它。 现在我已经编写了它收集错误并成功显示它的类,但是当有两个相同的错误时,该类会抛出异常。 (我使用错误代码来处理错误。错误代码的值在resx文件中,显示方法将从该处获取值并显示它。显示效果很好)

//The code where it collects Error 
if (objdepartment.Departmentname == null)
{
    ErrorCollection.AddErrors("A1001","Department Name");
}
if (objdepartment.Departmentcode == null)
{
    ErrorCollection.AddErrors("A1001","Department code");
}

//In the Errorcollection  

public class ErrorCollection
{
    static Dictionary<string,List<string>> ErrorCodes;
    private ErrorCollection() { }

    public static void AddErrors(string eCode,params string[] dataItem)
    {
        if (ErrorCodes == null)
        {
            ErrorCodes = new Dictionary<string, List<string>>();
        }
        List<String> lsDataItem = new List<String>();
        foreach (string strD in dataItem)            
            lsDataItem.Add(strD);
        ErrorCodes.Add(eCode, lsDataItem);
    }

    public static string DisplayErrors()
    {
        string ErrorMessage;
        //string Key;
        ErrorMessage = String.Empty;
        if (ErrorCodes != null)
        {
            string Filepath= "D:\\Services\\ErrorCollection\\";
            //Read Errors- Language Specsific message from resx file.
            ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("ErrorMessages", Filepath, null);
            StringBuilder sb = new StringBuilder();
            foreach (string error in ErrorCodes.Keys)
            {                
                List<string> list = ErrorCodes[error];
                if (error == "A0000")
                {
                    sb.Append("System Exception : " + list[0]);
                }
                else
                {
                    sb.Append(rm.GetString(error) + "\nBreak\n");
                }

                for (int counter = 0; counter < list.Count; counter++)
                {
                    sb.Replace("{A}", list[counter]);
                }
            }
            ErrorMessage = sb.ToString();
        }
        return ErrorMessage;
    }
}    

现在有两个常见错误。然后代码在“ErrorCodes.Add(eCode, lsDataItem)”行中显示类似“datakey已存在”的异常;“ (异常抛出的斜体部分)

2 个答案:

答案 0 :(得分:3)

好吧,有一件事,这个静态是个糟糕的主意。您应该创建ErrorCollection实例以将错误添加到IMO,并使变量成为实例变量而不是静态。

然后你需要在AddErrors内采取不同的方法,如果密钥已经存在,可能会添加所有新项目。像这样:

List<string> currentItems;
if (!ErrorCodes.TryGetValue(eCode, out currentItems))
{
    currentItems = new List<string>);
    ErrorCodes[eCode] = currentItems;
}
currentItems.AddRange(dataItem);

答案 1 :(得分:2)

您正在添加“A1001”两次作为字典中的键。这根本不允许。但是,更紧急 - 为什么字典静态?这意味着任何地方,共享该错误集合。

建议:

  • 使它不是静态的(这是一个坏主意 - 也是,它不同步)
  • 检查密钥的存在,并做出相应的反应:

    if(ErrorCodes.ContainsKey(eCode)) ErrorCodes[eCode].AddRange(lsDataItem);
    else ErrorCodes.Add(eCode, lsDataItem);
    

另外,您也可以考虑实现IDataErrorInfo,它是此类功能的内置标准包装器,并将为您的错误收集提供支持,以便使用一些标准API。但是在你需要它之​​前不要急于求成; p