1

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

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

所以简而言之,报告由数据引起的错误的最佳/最被接受的方法是什么,所以来自一个类?

4

3 回答 3

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 具有 Role 属性)。

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,UI 都只需要使用 API。API 负责报告可供 UI 使用的信息,而 UI 负责以最适合该 UI 的方式显示信息。

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

I highly recommend that you read Framework Design Guidelines. It covers a lot of this material and is an extremely great read.

于 2012-04-15T05:26:48.360 回答
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.
}

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

于 2012-04-15T02:06:03.613 回答
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);
     } 
  }  

}
于 2012-04-15T02:19:24.677 回答