使用异常处理设计函数
本文关键字:函数 异常处理 | 更新日期: 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.
}