使用异常处理设计函数

时间:2014-06-09 18:08:54

标签: c# exception-handling

我的设计目标。 当进一步的执行代码在该代码块中停止时,有两种情况 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"我只想说"发生一些错误。"对于开发人员/支持团队,我将向他们展示错误的确切原因而无需调试工具,他们将能够解决问题。

4 个答案:

答案 0 :(得分:1)

通常,您应该尝试不对业务逻辑流使用例外,它们被设计为规则的“例外”。您可以使用返回类型:

public Status GenerateReport()
{
    if(no data present)
        return Status.NoData;
}

此时,您可以使用查找来查找要显示给该用户的相应消息。如果你真的想使用Exceptions,那么创建你自己的:

public class ReportException : Exception
{
    public ReportException(String message) : base(message)
    {}
}

此时,您只需捕获ReportExceptions即可向用户显示消息并忽略其他所有内容。为了进一步改进此异常,您可以在构造函数中提供enum,以便查找消息:

public ReportException(Status status) { }

public String ReportStatus
{
  get { return messages[this.status]; }
}

这里的优势在于,如果您的应用程序都需要其他语言,则可以更轻松地本地化消息。

答案 1 :(得分:0)

传统上,你的"类型2例外"根本不应该是一个例外。例外情况适用于特殊情况 - 当程序无法按预期执行时发生,即您的第一个示例等情况;理想情况下永远不会发生的情况。

您的第二个示例代表了发生的情况 - 用户正在寻找那些不存在的东西。那个预期因此不会引起异常。在这种情况下,您应该只返回一个表示没有数据的值,然后检查此值并显示相应的消息。

在某些情况下,您可能还希望记录已发生这种情况,以便您拥有用户交互的审计跟踪,这将允许您识别常见模式和/或解释事后原因用户没有找到他/她正在寻找的东西。

答案 2 :(得分:0)

我同意其他的,例外不应该控制工作流程,不应该用于驱动业务逻辑。有了这个说这里有几个选择来帮助,但当然有很多方法可以给这只猫皮肤。

代码合同:for .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/

企业库验证

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

希望这有帮助...... Le's是一个非常简单的实现。

答案 3 :(得分:0)

异常用于例外情况。阅读我的文章:What are exceptions

在您的情况下,您说没有找到数据是有效的,在这种情况下,您可以使用空报告(如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.
}