您的框架级别的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。它涵盖了很多这种材料,是一个非常棒的阅读。
我们一点一滴地学习着东西,所以这还没有被覆盖。所以我不确定我是否应该阅读它,这可能会让我感到困惑,而不是帮助我。但我会看看。我有一个问题,公众枚举是做什么的?从未见过它。 – Gideon 2012-04-15 16:01:20
枚举是一组不同的名称,可以有一个基本类型为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