使用异常处理设计函数

本文关键字:函数 异常处理 | 更新日期: 2023-09-27 18:07:39

我的设计目标。在两种情况下,执行的进一步代码会停止在该代码块中1. 发生某些运行时错误时2. 基于一些业务逻辑

当有一个错误,它会抛出异常,我不想显示给业务用户。但是当有一些业务逻辑错误/验证失败时,我希望用户知道他/她可以修复它并进一步进行。

例子
Type 01: unable to cast to string Exception
Type 02: No Data is present in system against this criteria.

代码块:

//int for Error Code to distinguish type 01 errors and type 02 errors.
//message for Error message
public int generateReport(ref string Message)
{
    try
    {
        //Fetch Data here
        if(no data present)
        {
            throw new Exception("No Data Present in system against this criteria").
        }
        string message = dataTable;
    }
}

那么"Type 02 Exception"的最佳方法是什么,以便我能够与用户沟通问题。如果是"Type 01 Exception",我会简单地说"发生了一些错误",对于开发人员/支持团队,我会告诉他们错误的确切原因,而不需要调试工具,他们就能解决问题。

使用异常处理设计函数

一般来说,您应该尽量不要在业务逻辑流中使用异常,它们被设计为规则的"例外"。您可以使用返回类型:

public Status GenerateReport()
{
    if(no data present)
        return Status.NoData;
}
此时,您可以使用查找来查找要显示给该用户的适当消息。如果你真的想使用异常,那么创建你自己的:
public class ReportException : Exception
{
    public ReportException(String message) : base(message)
    {}
}
此时,您可以捕获ReportExceptions以向用户显示消息,而忽略其他所有内容。为了进一步改进此异常,您可以在构造函数中提供一个enum,以便查找消息:
public ReportException(Status status) { }
public String ReportStatus
{
  get { return messages[this.status]; }
}
这样做的好处是,如果应用程序需要额外的语言,可以更容易地对消息进行本地化。

传统上,你的"类型2异常"根本不应该是一个异常。异常是针对异常情况的——当程序不能按预期执行时,即像第一个例子那样的情况;理想情况下不应该发生的情况。

第二个例子代表了经常会发生的情况——用户正在寻找不存在的东西。这是预期的,所以不会导致异常。在这种情况下,您应该只返回一个值,表示没有数据,然后检查该值并显示相应的消息。

在某些情况下,您可能还需要记录这种情况,以便对用户交互进行审计跟踪,这将允许您识别常见模式和/或解释事后为什么用户没有找到他/她正在寻找的内容。

我同意其他人的看法,异常不应该用来控制工作流,也不应该用来驱动业务逻辑。话虽如此,这里有几个选项可以帮助你,当然还有很多方法可以给这只猫剥皮。

代码契约:用于。net 4.5+

http://msdn.microsoft.com/en-us/library/dd264808 (v = vs.110) . aspx

:Le有一个有趣的方法来处理这个…

http://blog.longle.net/2013/06/03/building-an-extensible-fluent-validation-framework-using-generic-funcs-and-wiring-it-up-to-mvc-4/

另一个验证器. .

https://fluentvalidation.codeplex.com/

Enterprise Library Validation:

http://www.codeproject.com/Articles/256355/Microsoft-Enterprise-Library-Introduction-to-V

希望这有助于…这是一个非常简单的实现。

异常用于异常情况。阅读我的文章:什么是例外

在你的情况下,你说它是有效的,没有发现数据,在这种情况下,你可以通过使用一个空的报告(如string.Empty):

public Report GenerateReport(string message)
{
    if(no data present)
    {
        return Report.Empty;
    }
    // create report here
    return generatedReport;
}

在报表类中使用静态只读字段:

public class Report
{
    public static readonly Report Empty = new Report("This report is empty");
    // read of the class like constructors etc.
}