2012-06-04 28 views
3

处理异常我有一个ASP.NET Web Forms应用程序与UI服务层库层如何在多层的ASP.NET Web应用程序

一些在我服务层的方法与一个Web服务进行通信,因此,我想换都到Web方法的调用在Try-Catch-Finally结构。

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

public RegistrationDetails GetRegistrationDetails(int userId) 

public bool RegisterUser(UserData myUserData) 

RegistrationDetailsmyUserData的对象类型(类)。

我担心的是:如果我创建一个Try-Catch-Finally来包装调用Web服务上面列出的方法的实现中,如果有一个例外,我怎么能返回的消息字符串如果返回类型RegistrationDetailsbool

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

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

public RegisterResponse RegisterUser(UserData myUserData) 

,然后检查ExceptionMessage是nullString.Empty。这是一个好方法吗?由于

+0

我通常让异常冒泡到一个窗体并在那里处理它。当您在较低级别捕获特定异常时,可能是因为错过了某处之间错误的真正原因。在较低的水平,我只是把它们扔出来...... – IrishChieftain

+0

感谢您的回答。我想捕捉所有异常的原因是为了避免用户看到典型的ASP.NET错误页面。我想要处理它们并向用户(通过用户界面)显示最佳信息,以便简化问题解决过程。 – CiccioMiami

回答

0

1)正如IrishChieftain提到,鼓泡异常下降到形式是好的,你就可以将异常更好地应对

2)您也可以有一个参考参数作为数组存储例外从方法

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

3)对于实例化对象在所生成的消息,可以有ArrayList中的错误的实例变量,并且具有在属性返回

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 
} 

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

0

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

你可以期望两种类型的客户端级别的异常:

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

第一类应在被捕获的try-catch-终于在你的网页表单层,但第二类应该在服务层被捕获,记录下来,然后在RegisterResponse包裹起来OBJ如你所建议的那样。但是,而不是发送异常。消息,您可能会考虑使用预期错误的枚举(使用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。

相关问题