什么归来?错误字符串,错误字符串输出的Bool或具有异常的空字符

Pre*_*zel 2 exception-handling return exception return-value

我将大部分时间都花在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;
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是明确的YES或NO,您可以将其嵌入到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;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一种"弱"的做事方式.

或者我应该让我的方法"无效",只是不处理异常,以便它被传递回调用函数?

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; 
}
Run Code Online (Sandbox Code Playgroud)

这似乎对我来说最明白(出于某种原因).但与此同时,将这两行包装在我需要进行身份验证的每个地方输入2行的唯一真正优势是我不需要包含"LDAP://"字符串.这种方式的缺点是用户必须将此方法放在try-catch块中.

思考?

有没有其他方法可以做到这一点,我没想到?

Aar*_*lla 6

没有"一刀切".如果返回一个标志,那么可以很容易地使用方法if()和循环.例外总是需要很多锅炉板代码.如果您只想要一个可以向用户显示的字符串(例如,在Web UI中),则返回错误字符串(或null"无错误")也是好的.

但是大多数时候,我抛出一个异常(并且在Java中是一个子类RuntimeException)因为这允许我返回多个关于错误的信息(例如:哪个文件导致错误?哪一行/列?我在做什么?表单中的哪个字段应标记为非法?等).

在您的情况下,您无法处理方法中的异常,因此您不应该捕获它.只有在你能做些什么的时候才能抓住它.