【发布时间】:2010-04-07 14:38:06
【问题描述】:
我大部分时间都花在 C# 中,并试图找出处理异常的最佳实践,并将错误消息从被调用方法干净地返回给调用方法。
例如,这里是一些 ActiveDirectory 验证代码。 请将此方法想象为类的一部分(而不仅仅是一个独立的函数。)
bool IsUserAuthenticated(string domain, string user, string pass, out errStr)
{
bool authentic = false;
try
{
// Instantiate Directory Entry object
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, user, pass);
// Force connection over network to authenticate
object nativeObject = entry.NativeObject;
// No exception thrown? We must be good, then.
authentic = true;
}
catch (Exception e) { errStr = e.Message().ToString(); }
return authentic;
}
这样做的好处是明确的“是”或“否”,您可以将其嵌入到您的 If-Then-Else 语句中。缺点是它还需要使用该方法的人提供一个字符串来获取错误(如果有的话)。
我想我可以用相同的参数减去“out errStr”来重载这个方法,但是忽略错误似乎是个坏主意,因为这种失败可能有很多原因......
另外,我可以编写一个返回错误字符串的方法(而不是使用“out errStr”),其中返回的空字符串意味着用户验证正常。
string AuthenticateUser(string domain, string user, string pass)
{
string errStr = "";
try
{
// Instantiate Directory Entry object
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, user, pass);
// Force connection over network to authenticate
object nativeObject = entry.NativeObject;
}
catch (Exception e) { errStr = e.Message().ToString(); }
return errStr;
}
但这似乎是一种“弱”的做事方式。
或者我应该让我的方法“无效”而不处理异常,以便将其传递回调用函数?
void AuthenticateUser(string domain, string user, string pass)
{
// Instantiate Directory Entry object
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, user, pass);
// Force connection over network to authenticate
object nativeObject = entry.NativeObject;
}
这对我来说似乎是最理智的(出于某种原因)。然而与此同时,将这两行包装起来而不是在我需要验证的任何地方键入这两行的唯一真正优势是我不需要包含“LDAP://”字符串。这样做的缺点是用户必须将此方法放在 try-catch 块中。
想法?
还有其他我没有想到的方法吗?
【问题讨论】:
标签: exception exception-handling return-value return