我是一名IT学生,第二年。我们刚学会用3层编程,一层用于通过类获取数据,一层用于处理带有请求的东西(所有方法都在这里),另一层用于程序本身的工作。看到前两个进入课程而不是表格,我不知道如何显示错误。
实施例: 我们需要使用webbrowser和其他一些东西创建一个登录系统。所以我在课堂上登录,但是如何检查错误?我不认为做MessageBox.Show(错误)是正常的,甚至是不可能的;从一个类,我只能返回东西,但我希望尽可能返回用户名/ id。
简而言之,报告由数据引起的错误的最佳/最常用方法是什么?所以从一个类开始?
答案 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);
}
}
}