ASP.NET в MVC 4, бросок HttpException против возвращения HttpStatusCodeResult?
Я разрабатываю RESTful сервис, и я хочу вернуть 400 для всех неподдерживаемых URL-адресов.
у меня вопрос когда я должен выбрать метод 1 методом 2, и наоборот..
//method 1
public ActionResult Index()
{
//The url is unsupported
throw new HttpException(400, "Bad Request");
}
этот, кажется, лучше?
//method 2
public ActionResult Index()
{
//The url is unsupported
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request");
}
4 ответов:
второй кажется лучше, так как он не включает в себя исключение метания, которое приходит на микро-стоимости по сравнению с первым примером.
находясь в DevOps команда, мы все в настроении, где бросать больше оборудования на что-то, чтобы получить немного лучший результат, всегда является хорошей причиной. Поэтому я намеренно игнорирую микро-стоимость запуска исключения .NET.
Если вы используете структуру телеметрии, например ApplicationInsights тогда просто возврат кода состояния дает вам не более чем"неудачный запрос". Это не дает вам никакой полезной информации, что позволяет либо скомпилируйте, либо получите любую информацию о "почему" неудачного запроса.
платформы телеметрии ожидают и хотят, чтобы вы бросили, потому что телеметрия ошибок обычно связана с исключениями .NET, поэтому, если вы не бросаете, вы создаете проблему для операций.
на самом деле я приземлился здесь, потому что я в процессе написания Рослин анализатор и CodeFix для проекта, где люди любят писать
try{} catch { return BadRequest("put_the_reason_here"); }и ни DevOps, ни команды разработчиков не видят ничего полезного в системе телеметрии в ApplicationInsights.
на мой взгляд, вам нужно сначала рассмотреть, если запрос сделан на неподдерживаемые URL-адреса. Тогда вы думаете, что это исключительная ситуация или вы ожидаете, что это произойдет? Если вы считаете это исключительной ситуацией, то создайте и бросьте исключение (Вариант 1). Если вы ожидаете, что вы получите много запросов на неподдерживаемый URL-адрес, то рассматривайте его как функцию вашего приложения и используйте метод 2.
Это говорит, что вам нужно будет снова подумать о своих клиентах, если вы ожидаете слишком много запросов на неподдерживаемые URL-адреса. В общем, я бы предпочел бросить исключение, поскольку я не ожидаю получить слишком много запросов на неподдерживаемые URL-адреса, и если это произойдет, я хотел бы зарегистрировать его как исключение и исследовать причину.
хотя этот вопрос немного стар, я решил, что дам свой вклад, так как я столкнулся с этим.
ошибки это значения. Это касается
HttpException(когда не растет) , а такжеHttpStatusCodeResult. Однако создаваемые исключения создают новые пути кода, которые скрыты от ваших коллег, которые могут быть одним контекстом выполнения выше, чем ваш, и должны быть предоставлены документы о том, что эти пути кода будут переданы им без уведомления. Однако ценности, все, что вам нужно знать через их типаж. Вы можете использовать их тип в ожидаемом пути выполнения, чтобы определить, произошла ли ошибка, а также найти связанную с этой ошибкой информацию и зарегистрировать ее.Я иногда использую (слегка расширенная)
Exceptionне бросая их в следующий контекст выполнения, чтобы извлечь полезную отладочную информацию, которую упомянул Дэвид Родригес. Никогда не бывает оправдания для передачи брошенных исключений для контекстов выполнения выше вас, которые на самом деле не являются исключительными, и это только действительно относится к вещам, которые на самом деле находятся за пределами способности вашего кода обрабатывать (StackOverflowException, другие фатальные системные исключения и т. д.).в сетевом приложении, таком как любая служба MVC, которую вы запускаете, штраф за производительность от выбрасывания исключений бессмыслен. Семантика и влияние на ремонтопригодность, не являются.
сетевые ошибки-это значения, и вы должны обрабатывать их так.
Comments