Error from class

本文关键字:class from Error | 更新日期: 2023-09-27 18:31:04

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

例:我们需要创建一个带有网络浏览器和其他一些东西的登录系统。所以我在课堂上登录,但如何检查错误?我认为做消息框显示(错误)是不正常的,甚至是不可能的;从类中,我只能返回东西,但我希望尽可能返回用户名/ID。

简而言之,报告由数据引起的错误的最佳/最可接受的方法是什么?

Error from class

您的框架级别 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 来说,这甚至可以是一个值类型(结构),其中包含有关结果的更多信息(例如字符串消息或其他内容)。由于这些类型的操作是非关键操作,因此此处没有必要例外。异常代价高昂,并且并不总是需要报告错误。

现在让我们谈谈不同类型的错误。逻辑开发人员错误。这些应该通过引发异常来处理。以此示例为例(假设我们有某种具有角色属性的帐户类型)。

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 Window、WebForm 还是其他 UI,UI 都只需要使用 API。API 负责报告 UI 可以使用的信息,UI 负责以最适合该 UI 的任何方式显示信息。

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

我强烈建议您阅读框架设计指南。它涵盖了很多这样的材料,是一本非常棒的读物。

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

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.
}

如果发生超出预期逻辑流的任何错误,则应引发异常。

好吧,

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

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);
     } 
  }  
}