我想写一个用户定义的错误集合类,它应该收集所有的错误。当我们验证实体对象时,如果没有错误,它应该去并保存到数据库。如果错误那里它应该显示它。 现在我已经编写了它收集错误并成功显示它的类,但是当有两个相同的错误时,该类会抛出异常。 (我使用错误代码来处理错误。错误代码的值在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已存在”的异常;“ (异常抛出的斜体部分)
答案 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