1

我需要你的建议。我的源应用程序变得非常..扩大。我有一个小问题处理错误,异常等。处理异常,错误和返回值的问题

比如我有“DatabaseProvider”类,其中一些方法与DB联系。我必须处理标准异常,无效的数据表单数据库(例如错误的电子邮件格式),从数据库返回的错误。所有我需要返回到调用DatabaseProvider方法的函数的东西,以便该方法将记录此异常或错误,并仍然工作。所以我不能抛出异常。

如果这还不够,我必须回到(从DatabaseProvider)在大多数情况下,或对象或对象列表的价值。

所以我想,也许是创建一个类“响应”。并且该类的对象将从我的应用中的每种方法返回。

STH这样的:

​​

但如何返回(例如)自我设计对象在同一时间列表?

使用“out”参数是解决方案吗?什么是最佳方法(最佳实践)?我正在寻找,但我发现的是如何处理异常(仅)..

+1

是否有一个理由,为什么你不希望实现自定义异常?您的目标是始终返回这些信息,而不仅仅是当出现问题时。从你的例子来看,它看起来非常以错误为中心 –

回答

3

我会建议实现一个自定义异常,你可以抛出并捕获,而不是返回这些信息,因为它似乎非常具体的错误。

但是,如果你总是希望某些元信息附加到返回的结果,您可能会实现小型车辆类来包装,而承载元信息的结果:

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所说,这些可以在循环内被捕获并在那里处理,而不会停止后续任务的执行。该语言支持异常处理的理由很充分 - 我会利用它。

此外,仅供参考在你的模式:

public bool Error { get; set; } 
public string ErrorMessage { get; set; } 

没有必要为bool。只是检查非空的错误信息/参考字段

+0

嗯,这并不是我没有抛出异常。我这样做,但有些情况下,当发生错误时,你想记录下来,但仍然返回一个值。 第二个原因是计时器循环的问题(我解释说,在评论到Petar Ivanov的回答 – Marshall

+0

无论如何,这是一个很好的编程习惯,以元信息返回值?是否很受欢迎?它看起来非常好,但如果它使用非常很少,也不是很好的解决方案..我必须再考虑一遍 – Marshall

+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 
    } 

这正是自定义例外的用途。

这样你仍然可以从函数返回要返回(列表或其他)的事情。

+0

我知道,但我还不确定。 我有一个计时器循环,它可以获取许多任务,并逐个执行它们。现在,当一个随机任务失败 - >我抛出一个异常。异常会中止计时器滴答,队列中的其余任务将不会执行。 当一个任务失败时,我想记录它 - 但继续其余的。我想记录关于发生了什么的每一个想法。 – Marshall

+0

好吧,你在调用者函数中捕获异常 - 什么都不会中止:) –

+0

因此,整个计时器循环将在try catch(Exception ex)中。里面会有另一个try catch(MyException myex)块,但是在这秒内它将只有“Execute”函数。在catch(MyException myex)中 - 我将记录所有的东西,以防万一失败。我必须再次考虑它,但听起来不错。 – Marshall