上课错误

时间:2012-04-15 02:00:19

标签: c#

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

实施例: 我们需要使用webbrowser和其他一些东西创建一个登录系统。所以我在课堂上登录,但是如何检查错误?我不认为做MessageBox.Show(错误)是正常的,甚至是不可能的;从一个类,我只能返回东西,但我希望尽可能返回用户名/ id。

简而言之,报告由数据引起的错误的最佳/最常用方法是什么?所以从一个类开始?

3 个答案:

答案 0 :(得分: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,这甚至可以是包含有关结果的更多信息的值类型(struct)(例如,字符串消息或其他内容)。因为这些类型的操作非关键,所以这里没有必要例外。例外代价很高,并不总是报告错误。

现在让我们谈谈一种不同类型的错误。逻辑开发人员错误。这些应该通过抛出异常来处理。举个例子(假设我们有一个具有Role属性的类型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";
    }
}

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

现在我已经给出了两个粗略的场景,这对你的问题有什么影响?这些是API。无论您的UI层是什么,无论是WinForm,WPF窗口,WebForm还是其他UI,UI都只需要使用API​​。 API负责报告UI可以使用的信息,并且UI负责以最适合该UI的任何方式显示信息。

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

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

答案 1 :(得分: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.
}

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

答案 2 :(得分: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);
     } 
  }  

}