我需要你的建议。我的源应用程序变得非常...扩展。我在处理错误,异常等方面遇到了一些问题。
例如,我有“DatabaseProvider”类,其中有与db联系的方法。我必须处理标准异常,无效数据表单数据库(例如错误的电子邮件格式),从数据库返回的错误。我需要返回到调用DatabaseProvider方法的函数的所有东西,以便该方法将记录此异常或错误,并仍然工作。所以我不能抛出异常。
如果这还不够,我必须在大多数情况下返回(从DatabaseProvider)一个值或对象或对象列表。
所以我想,也许创建一个类“响应”。该类的对象将从我的应用程序中的每个方法返回。
是这样的:public class Response { public bool Error { get; set; } public string ErrorMessage { get; set; } public bool DatabaseError { get; set; } public string DatabaseMessage { get; set; } public Exception ex { get; set; } }
但是如何在同一时间返回(例如)自设计对象列表?
使用“out”参数是解决方案吗?什么是最好的方法(最佳实践)?我正在搜索这个,但我发现的只是如何处理异常(仅)...
答案 0 :(得分:4)
我会实现一个自定义异常,包含在异常情况下需要传递的所有数据。像
这样的东西public class MySpecificException: Exception
{
public bool Error { get; set; }
public string ErrorMessage { get; set; }
public bool DatabaseError { get; set; }
public string DatabaseMessage { get; set; }
public Exception ex { get; set; }
}
抛出异常并在调用函数中使用try catch块来处理特定异常。
public void CallingFunction()
{
try {
//call your function
}
catch (MySpecificException ex)
{
//log the data from the exception
}
这正是自定义例外的用途。
这样你仍然可以从函数返回你想要返回的东西(列表或其他)。
答案 1 :(得分:3)
我建议实现一个自定义的Exception,你可以抛出并捕获,而不是返回这些信息,因为它看起来非常错误。
但是,如果您总是希望将某些元信息附加到返回的结果中,您可以实现一个小型车辆类来包含元信息时的结果:
abstract class ResultWrapper
{
//meta info, such as error references/properties/flags/statistics
public ResultWrapper([meta info])
{
//set meta info
}
}
class ResultList<T> : ResultWrapper
{
public readonly List<T> resultList;
//constructor for resultList, plus meta information for parent
public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info])
{
this.resultList = resultList;
}
}
class SingleResult<T> : ResultWrapper
{
public readonly T result;
//constructor similar to above
}
编辑:根据您的评论,您绝对应该使用可以抛出的自定义异常(可能包装导致例外)。正如Petar所说,这些可以在循环内捕获并在那里处理,而不会停止后续任务的执行。该语言支持异常处理,原因很充分 - 我会使用它。
另外,你的模式中的fyi:
public bool Error { get; set; }
public string ErrorMessage { get; set; }
不需要bool
。只需在错误消息/参考字段