如何将 DAL / Business 层的错误和其他消息传递到 UI 层?

4
许多资源都建议让错误从较低层“冒泡”上来,但我不确定如何在我的应用程序中实现这一点。我需要为验证或其他错误创建一个单独的实用程序类,并在每个层面监听它吗?
例如,如果用户输入电子邮件地址,只允许唯一的电子邮件地址,那么我假设我会在业务层进行检查。当我从 UI 调用业务逻辑时,我是否只需要在我的业务类中包含输出参数以获取错误/错误消息?我应该将已处理异常与业务规则异常视为相同吗?
以下是 BLL 代码示例:
public class user()
{
    public void Save(UserObject myUser, out bool result, out string resultMsg )
    {
    }

    OR

    string saveResultMsg;

    public bool Save(UserObject myUser)
    {
        saveResultMsg = "bad data whatever";
        return false;    

    }

}
3个回答

3

这真的取决于您想要做什么,理想情况下,异常应该用于异常情况,而不是控制流程。

我喜欢使用内部验证过程并具有布尔型“保存”方法。如果为false,则可以检查“验证异常”属性以查看未保存条目违反了哪些规则。

如果需要,您也可以使用异常,只需确保使用适当的异常类型而不是基本异常类。


例如,如果我从我的BLL调用保存方法到DAL时出现数据库错误,我该如何将该错误传递回UI层?您提到的仅具有布尔SAVE和基本类属性以获取错误详细信息的评论对于UI使用业务类非常合理。谢谢。 - jpshook
从技术上讲,这要看情况。如果你无法恢复并且希望让 UI 处理错误,那么你可以直接让异常抛出。数据库连接问题通常建议允许其冒泡到顶层。 - Mitchel Sellers

2
例如,如果用户输入电子邮件地址,并且只允许唯一的电子邮件地址,我认为我应该在业务层中进行检查。当我从UI调用业务逻辑时,我是否应该在我的业务类中包含输出参数以处理错误/错误消息?我是否应该将已处理的异常与业务规则异常视为同一种异常?
我更喜欢提供一个应用程序层可以使用的方法来检查唯一性,然后在业务层中再次检查并抛出异常,如果调用者尝试保存重复值。
除非这两个数据库调用实际上会导致性能问题,否则我通常发现分离命令和查询逻辑是值得的。
(我是针对商业应用程序提供此建议的,其中大多数具有适度的性能要求。有许多其他类型的软件,该方法并不总是或永远不合适。)

@Jeff Sternal - 你建议如何将DAL / BLL中的错误实际传递到UI? - jpshook
UI在调用业务逻辑层或数据访问层之前负责验证数据。如果没有正确地完成验证,我建议使用异常来将信息传递给UI。数据访问层(DAL)和业务逻辑层(BL)都不应该捕获它们无法处理的异常(而是记录下来),这是UI的职责。 - Jeff Sternal

0

您可以为应用程序创建自定义异常,当出现错误时,让您的业务层抛出这些异常,然后让您的UI/消费者正确处理这些自定义异常。

在您的情况下,我可能会做以下操作:

[Serializable]
public class EmailValidationException : Exception
{
    // overriden constructors would go here

    private List<string> _validationMessages = new List<string>();

    // store your validation exception messages in a collection
    public ReadOnlyCollection<string> ValidationMessages 
    {
        get
        {
            return _validationMessages.AsReadOnly();
        }
    }
}

@Justin Niessner - 你需要为每种类型的验证或可重复使用的通用错误类/集合创建这样的类。我对.Net还很陌生。 - jpshook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接