3

我有一个带有UI服务层存储库层的 ASP.NET Web 窗体应用程序。

我的服务层中的一些方法与 Web 服务通信,因此我想将对 Web 方法的所有调用包装在一个Try-Catch-Finally构造中。

假设我的服务层中有以下方法:

public RegistrationDetails GetRegistrationDetails(int userId)

public bool RegisterUser(UserData myUserData)

WhereRegistrationDetailsmyUserData是对象类型(类)。

我关心的是:如果我创建一个Try-Catch-Finally以在上面列出的方法的实现中包装对 Web 服务的调用,如果出现异常,如果返回类型是RegistrationDetails和,我如何返回消息字符串bool

我正在考虑为每个返回对象添加一个属性,但我不知道这是否是一个好的解决方案。例如,而不是使用bool

public class RegisterResponse
{
   public bool isRegistered { get; set; }
   public string ExceptionMessage { get; set; }
}

public RegisterResponse RegisterUser(UserData myUserData)

然后检查 ExceptionMessage 是否为nullString.Empty。这是一个好方法吗?谢谢

4

2 回答 2

0

1)正如IrishChieftain所说,将异常冒泡到表格中是好的,您将能够更好地响应异常

2)您还可以将引用参数作为数组存储从方法生成的异常消息

public bool RegisterUser(UserData myUserData, optional ref ArrayList<string> errors)
{
  if(error)
    errors.Add("This error occured")
}

3) 对于 Instance Object,您可以有一个 ArrayList 的 Instance 变量用于错误,并在属性中返回该变量

public class MyClass
{
   private ArrayList<string> errors = new ArrayList<string>

   public ArrayList<string> ExceptionMessages()
   {
      get 
      {
          return errors;
      }
   }

  public RegistrationDetails GetRegistrationDetails(int userId) { }
}

//Used like this:
MyClass c = new MyClass();
c.GetRegistrationDetails();

if(c.ExceptionMessages > 0)
{
    //output errors
}

但我更喜欢第一种方法 - 像输出格式这样的灵活性

于 2012-06-04T17:14:27.150 回答
0

将原始异常从服务传递给您的客户端(Web 表单层)可能会有风险。如果它是数据库异常,它可能会暴露您的数据库的详细信息。恶意用户可能会从他们自己的应用程序中调用您的服务层方法。

您可以在客户端级别预期两种类型的异常:

  1. 通信异常(连接到服务的问题)
  2. 服务器端错误(数据库问题、用户名不唯一、密码无效……其他业务规则异常)

第一种类型应该在 web 表单层的 try-catch-finally 中捕获,但第二种应该在服务层中捕获,记录,然后RegisterResponse按照您的建议包装在对象中。但是,除了发送 Exception.Message 之外,您可能会考虑使用预期错误的枚举(使用 ServerError 成员来涵盖其他任何内容。)您还可以将 EventId 添加到响应和日志条目中,以便您可以调查错误。

public enum RegisterResponseError { NoError = 0, SystemError = 1, 
    UserNameNotUnique, PasswordInvalid, etc.  }

public class RegisterResponse
{
   public bool isRegistered { get; set; }
   public RegisterResponseError ErrorCode { get; set; }
}

然后在您的客户端代码中,

if(myRegisterResponse.ErrorCode == RegisterResponseError.NoError)
   // everything was fine
else
  // show a suitable error message for ErrorCode and display EventId (if logging)

您可以从您的服务返回一个错误字符串,但最好管理 Web 表单层中的任何内容,以防您以后需要本地化内容或使用 CMS。

于 2012-06-04T17:58:01.863 回答