2012-04-15 47 views
1
的错误

我是第二年的IT学生。我们学习了3层编程,一个用于获取数据,一个用于处理有请求的东西(所有方法都在这里),另一个用于程序本身的工作。看到前两个进入类而不是形式我不知道如何显示错误。来自类

例如: 我们需要制作一个带有webbrowser和其他一些东西的登录系统。所以我在一个班级做登录,但是如何检查错误?我不认为这是正常的,甚至可能做MessageBox.Show(错误);从一个类,我只能返回的东西,但我希望用户名/编号返回,如果可能的话。

因此,总之,什么是最好的/最可接受的方式来报告由数据造成的错误,所以从一个类?

回答

2

您的框架级别的API(例如您的图层)应该为实际错误使用异常,并返回值以报告非严重错误。

public class Login 
{ 
    public bool AccountExists(string name) { 
     bool exists; 

     // do checking 

     return exists; 
    } 

    public LoginResult Login(string name, string password) { 
     // Try login 
     // If successful 
     return LoginResult.Success; 

     // What if the user does not exist? 
     return LoginResult.AccountNotFound; 

     // What about an error? 
     return LoginResult.Error; 
    } 
} 

public enum LoginResult 
{ 
    None, 
    AccountNotFound, 
    Error, 
    Success 
} 

在上面的示例中,您可以通过返回值报告操作的状态。对于LoginResult,这甚至可以是一个包含更多关于结果信息的值类型(结构体)(例如,一个字符串消息或其他东西)。由于这些类型的非关键操作,这里没有必要例外。例外是昂贵的,并不总是需要报告错误。

现在我们来谈谈一种不同类型的错误。逻辑开发人员错误。这些应该通过抛出异常来处理。以这个例子(假设我们有一些类型为Account的角色属性)。

public class Foo 
{ 
    public bool IsAdmin(Account account) { 
     if (account == null) { 
      throw new System.ArgumentNullException("You cannot pass a null account!"); 
     } 

     return account.Role == "Admin"; 
    } 
} 

作为开发者,我们知道该帐户不应该为空,因此我们应该检查它并抛出异常(如果是)。如果这个异常被抛出,它在调用代码中的一个错误,应该被修复而不是传入一个空值。

既然我已经给出了两个粗略的场景,那么这对你的问题又是如何的呢?这些是API的。无论您的UI层是什么,无论是WinForm,WPF Window,WebForm还是其他一些UI,用户界面都只需使用该API。 API负责报告UI可用的信息,UI负责以任何最适合该UI的方式显示信息。

框架API层不应该负责使用UI向用户报告错误。他们只应负责向可以采取结果的开发人员报告错误,并以某种方式将其连接到UI层。例如,您绝不会显示消息框或从框架API写入控制台。你会返回一些UI可以用来显示自己的消息的结果。

我强烈建议您阅读Framework Design Guidelines。它涵盖了很多这种材料,是一个非常棒的阅读。

+0

我们一点一滴地学习着东西,所以这还没有被覆盖。所以我不确定我是否应该阅读它,这可能会让我感到困惑,而不是帮助我。但我会看看。我有一个问题,公众枚举是做什么的?从未见过它。 – Gideon 2012-04-15 16:01:20

+0

枚举是一组不同的名称,可以有一个基本类型为sbyte,byte,short,ushort,int,uint,long或ulong。您可以使用枚举来表示一组值(例如一周中的几天)。您也可以使用枚举来表示标志。看到这篇文章。 http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx – 2012-04-15 18:25:51

1

你应该有一个类来验证数据对象并返回错误信息。然后,您的前端代码可以要求此类验证数据并显示返回的任何错误消息。

var username = GetUserName(); 
var password = GetPassword(); 
var validationResult = new Validator().ValidateLogin(username, password); 
if(validationResult.ErrorMessage != null) { 
    MessageBox.Show(validationResult.ErrorMessage); 
} else { 
    // Do what you would have done. 
} 

如果发生超出预期逻辑流程的错误,它们应该抛出异常。

+0

+1适当的方法 – ABH 2012-04-15 03:22:17

1

那么你可以使用例外。您只需抛出异常,由调用者决定如何处理异常。

class Login 
{ 
    public Login() 
    { 

    } 

    public bool CheckLogin(string userName, string password) 
    { 
    // Do your validation here. 
    If every thing goes fine 
    return True. 
    else 
    throw Exception("custom message."); 
    } 

} 

class Input //class which takes input. 
{ 
    Login login = new Login(); 

    public void TakeInput(string username, string password) 
    { 
    try 
    { 
     login.CheckLogin(username, password); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.show(ex.message); 
    } 
    } 

} 
+0

这看起来gooooood!我可以很好地使用这个。 :)今晚我会试一试,会报告回来。 – Gideon 2012-04-15 16:01:55

+0

异常昂贵。您应该*不*在非特殊情况下使用它们。登录失败并不是一个特殊的情况。 – 2012-04-16 03:49:21