2015-10-30 2 views
0

У меня есть веб-API 2 действия контроллера, который возвращает список пользователейОбработка исключений: что должен вернуть контроллер?

public List<User> GetAll() 
{ 
    try 
    { 
     return _businessLogic.GetAll(); 
    } 
    catch (Exception ex) 
    { 
     ExceptionHelper.HandleException(ex, _logger, ControllerContext); 
    } 
} 

class ExceptionHelper { 
    public static void HandleException(Exception ex, ILogger _logger, HttpControllerContext controllerContext) { 
     _logger.LogError(ex); 
     // If possible handle the exception here 
     // Code for handling 

     // Throw it again 
     throw new HttpResponseException(
      controllerContext.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessagError) 
     ); 
    } 
} 

C# компилятор жалуется, что не все кодовые пути в GetAll() возвращает значение. Дело в том, что я не хочу ничего возвращать, когда возникает исключение, потому что HandleException регистрирует ошибку и снова генерирует исключение. Как я могу прямо сказать, что я ничего не хочу возвращать.

+1

Вы уверены, что хотите вообще обрабатывать исключения? Как вы планируете обрабатывать '_businessLogic.GetAll()' исключения? Если вы просто хотите регистрировать исключение, есть другой способ - добавить пользовательский 'IExceptionLogger'. – Dennis

+0

Это может быть полезно: http://stackoverflow.com/questions/10732644/best-practice-to-return-errors-in-asp-net-web-api – 3615

ответ

-1

попробовать этот путь

public List<User> GetAll() 
{ 
    List<User> result = new List<User>(); 
    try 
    { 
     result _businessLogic.GetAll(); 
    } 
    catch (Exception ex) 
    { 
     ExceptionHelper.HandleException(ex, _logger, ControllerContext); 
    } 
    return result; 
} 

Одна точка входа. Одна точка выхода. Лично я предпочитаю возвращать пустые списки, а что-то плохое происходит, а не возвращает null.

+0

Это скрывает проблемы на стороне сервера. Зачем? – Dennis

+0

Это просто, чтобы дать ответ на проблему «не все проблемы с кодом pahs return a value». на самом деле я редко ломаю исключения в DAO или подобных классах и позволяю им правильно обрабатывать код клиента –

+0

Вы его не понимаете. Это - «Лично я предпочитаю возвращать пустые списки, если что-то плохое» - очень, очень плохая идея, независимо от возвращаемого значения. Если что-то происходит плохо, контроллер * должен * перебрасывать исключения (что приводит к HTTP 500 на стороне клиента). В противном случае «что-то плохое» не будет исправлено, пока кто-нибудь не заглянет в журнал сервера. – Dennis

1

Как правило, вы должны обрабатывать исключения, если знаете, как обращаться с ним, и что вы хотите получить после исключения. Поскольку исключения относятся к поврежденному состоянию, вы либо можете восстановить состояние, либо не должны обрабатывать исключение.

Для примера выше, путь к удалению - это вообще исключить обработку исключений. То есть:

public List<User> GetAll() 
{ 
    return _businessLogic.GetAll(); 
} 

Что может пойти не так в GetAll методе:

  • недоступного источнике данных (проблемы инфраструктуры);
  • неверный запрос/модель EF/etc (проблемы с кодом).

В любом случае, все они полностью соответствуют HTTP 500 «Внутренняя ошибка сервера», поскольку на самом деле это ошибки сервера. Чем раньше вы получите обратную связь от пользователя, тем раньше вы их исправите.

Общей практикой является исключение журнала. Web API позволяет делать это на заказ, как, вводя свой собственный IExceptionLogger реализации:

public static void Register(HttpConfiguration config) 
    { 
     // ... 
     // ApiNLogLogger is a custom logger, that uses NLog 
     config.Services.Add(typeof(IExceptionLogger), new ApiNLogLogger()); 
    } 
0

Мы знаем, что HandleException выбросит исключение снова, но компилятор не знает, что. Поэтому, чтобы удовлетворить проверку компилятора, не изменяя слишком много кода, вы можете просто добавить внутри блока catch throw;. Хотя этот throw; будет недоступен, но проверка на компиляцию пройдет, и ваша функциональность будет работать должным образом. Пример ниже:

public List<User> GetAll() 
{ 
    try 
    { 
     return _businessLogic.GetAll(); 
    } 
    catch (Exception ex) 
    { 
     ExceptionHelper.HandleException(ex, _logger, ControllerContext); 
     throw;//Added throw to remove compilation error. 
    } 
} 

class ExceptionHelper { 
    public static void HandleException(Exception ex, ILogger _logger, HttpControllerContext controllerContext) { 
     _logger.LogError(ex); 
     // If possible handle the exception here 
     // Code for handling 

     // Throw it again 
     throw new HttpResponseException(
      controllerContext.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessagError) 
     ); 
    } 
} 
Смежные вопросы