应用程序中各层之间的通信

Pet*_*hev 3 language-agnostic exception-handling layer

假设我们在业务层中有以下方法.告诉UI层出错的最佳做法是什么,并给出错误消息?该方法是否正常时返回一个空字符串,否则返回错误消息,或者它应该在包含捕获的异常的catch代码中抛出另一个异常?如果我们选择第二个变体,那么UI应该有另一个尝试,抓住哪个太多尝试,抓住可能.这是第一个变体的伪代码.

public String updateSomething()
{
   try
   {
      //Begin transaction here
      dataLayer.do1();
      dataLayer.do2();
      dataLayer.doN();
      //Commit transaction code here
   }
   catch(Exception exc)
   {
      //Rollback transaction code here
      return exc.message;
   }

   return "";
 }
Run Code Online (Sandbox Code Playgroud)

这是一个很好的做法还是我应该在catch中抛出另一个异常(那么方法将是无效的)?

Joo*_*oon 5

我喜欢从我的业务层返回标准合同到我的UI层.

它看起来像这样:

public class ServiceOperationResult<T>
{

    public bool Successful
    {
        get; 
        set;
    }

    public ServiceErrorType ErrorType
    {
        get;
        set;
    }

    public string ErrorMessage
    {
        get;
        set;
    }

    public T ReturnData
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用泛型,以便每个服务都可以定义它发回的内容,标准错误标志告诉客户端应用程序发生了什么类型的错误(这些是元类型,如"内部错误","外部方错误","业务规则验证错误")然后应用程序可以以标准方式对这些错误类型做出反应.

例如,业务错误显示在红色错误标签中,而内部错误则重定向到错误页面(在Web应用程序中)或关闭表单(在Windows应用程序中)

我的宠物讨厌在网站上看到一个红色标签(我希望看到验证错误)并看到类似"数据库服务器拒绝您的连接"这样的风险,您只能使用字符串来返回错误数据.