Прежде чем вы убежите и погуглите, я прочитал множество статей, постов и комментариев по обработке исключений, но я все еще застрял в этих конкретных моментах.
Учитывая приведенный ниже пример, как бы вы справились со следующими сценариями?
- Если исключение возникает на уровне DAL и заключено в пользовательское исключение, чтобы предоставить больше информации и лучше классифицировать ее. Как мне войти?
Если я запишу его так, как это происходит на уровне DAL, он снова будет зарегистрирован в глобальном обработчике (используя elmah). Я мог бы позволить этому распространяться, но что произойдет, если ServiceLayer потребуется перевести это исключение в более удобное для пользователя сообщение или, возможно, для транзакционных целей (подумайте об откате)? Я потеряю информацию, собранную в исключении DAL (в любом случае, сообщение не обязательно является трассировкой стека).
// UI
public static GetUser(int userId)
{
// Should I do validation here or in service layer
try
{
IUserService s = new UserService(userId);
s.GetUser(userId);
}
catch(ServiceLayerException ex)
{
// ex.Message displayed to user
}
}
// Service layer
public User GetUser(int userId)
{
try
{
return repo.GetUser(userId);
}
catch(DALException ex)
{
// user-friendly message displayed to user
throw new ServiceLayerException("User does not exist");
}
}
// DAL
public User GetUser(int userId)
{
try
{
// Query for user, if fails throw DALException
return userId;
}
catch (SqlException ex)
{
throw new DALException("Could not retrieve user with userId " + userId.ToString());
}
}