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