Я провожу большую часть своего времени в 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.
Мысли
Есть ли другой способ сделать это, о котором я не думаю?