Re[3]: обработка ошибок
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 07.04.22 23:21
Оценка: 5 (1) +1
Здравствуйте, MadHuman, Вы писали:

MH>ну да. кейс как раз и такой. клиент передал неверное значение аргумента.

Тогда нужно отфутболить запрос, не доходя даже до контроллера
В современном asp.net для этого очень много средств, смотри https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-6.0
Если не хватает атрибутов модели, то используй IValidatableObject

S>>То есть хэндлер рест-апи должен проверить аргументы, и только если они в порядке, ехать дальше.

MH>необязательно. задачу по проверке аргумента можно делегировать GetThing (т.к. она там внутри лучше знает что и как проверять).
Обязательно. То что ты предлагаешь это "проектирование снизу вверх", что почти всегда является антипаттерном.

MH>вопрос в том как это лучше обработать. дублировать в хэндлере логику проверки плохо, вынести код проверки аргумента из GetThing в отдельную функцайку

MH>и в хэндлере её дернуть — можно
И нужно, а по возможности вынести в атрибут валидации или в реализацию IValidatableObject.Validate

MH>но ... нехотелось бы.

Ты сам создал ограничения и с ними борешься. Ради чего?


MH>примерно так


MH>
MH>//рабочая функция. размещена в другом месте от хэндлера
MH>public static object GetThing(string arg1){

MH>  if ( some condition for arg1) {
MH>     throw new ArgumentException("arg1 invalid");
MH>  }
MH>  //do work
MH>}


MH>//хэндлер для апи ендпойнта
MH>public static object ProcApiRequest(string arg1, string arg2){

MH>  try {
MH>     var result1 = GetThing(arg1);
MH>     var result2 = DoSomeOtherWork(result1);
MH>     return MakeOutPut(result2);
MH>  } catch (ArgumentException ae){
MH>     return new HttpError(400, ae.Message); 
MH>  }
MH>}
MH>


А чем это принципиально лучше, чем:
public static object GetThing(string arg1){
  //do work
}


//хэндлер для апи ендпойнта
public static object ProcApiRequest(string arg1, string arg2){
  if ( some condition for arg1) {
    this.ModelState.AddModelError(nameof(arg1),"Condition failed");
  }
  if ( some other condition for arg2) {
    this.ModelState.AddModelError(nameof(arg2),"Condition failed");
  }

  if(!this.ModelState.IsValid) {
    return BadRequest(this.ModelState);
  }

  var result1 = GetThing(arg1);
  var result2 = DoSomeOtherWork(result1);
  return MakeOutPut(result2);
}

?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.