TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #2842 2.52K
День 2360. #ЗаметкиНаПолях
Улучшаем Обработку Ошибок в Минимальных API с ProblemDetails

Будем честны: обработка ошибок — обычно последнее, о чём мы думаем при разработке API. Но она должна быть одной из первых.

Представьте, фронтенд вызывает API и получает в ответ следующее: "Object reference not set to an instance of an object." Вряд ли это сообщение ясно и полезно. Для сравнения:
{
"title": "Что-то пошло не так.",
"status": 500,
"detail": "Пожалуйста, свяжитесь с поддержкой.",
"instance": "/products/0"
}

Это полезно и понятно. Именно это нам и даёт ProblemDetails.

Что это?
Стандартный способ возврата сообщений об ошибках в API, определённый в RFC 7807. Вместо случайного текста или несогласованного JSON вы возвращаете структурированные ошибки, например:
{
"title": "Product not found",
"status": 404,
"detail": "No product with ID 42.",
"instance": "/products/42"
}


В ASP.NET есть встроенная поддержка ProblemDetails, и она прекрасно работает и в минимальных API. Создадим пример минимального API, который
получает продукт по ID и возвращает ошибки, используя ProblemDetails.
public record Product(int Id, string Name);
…
// получаем продукт
app.MapGet("/products/{id:int}", (int id, HttpContext http) =>
{
var prod = context.Products
.FirstOrDefault(p => p.Id == id);

if (prod is null)
{
var notFound = new ProblemDetails
{
Title = "Продукт не найден",
Status = StatusCodes.Status404NotFound,
Detail = $"Продукт с ID={id} не найден.",
Instance = http.Request.Path
};

return Results.Problem(
title: notFound.Title,
detail: notFound.Detail,
statusCode: notFound.Status,
instance: notFound.Instance
);
}
return Results.Ok(prod);
});

app.Run();

Теперь запрос несуществующего продукта вернёт стандартный ответ ProblemDetails.

Дополнительные поля
Вы можете расширять ProblemDetails дополнительными данными:
public class CustomProblemDetails : ProblemDetails
{
public string ErrorCode { get; set; } = default!;
}

Затем возвращайте его через Results.Problem(…) и передавайте дополнительные метаданные.

Преимущества
- Чистые ответы об ошибках;
- Легкость для понимания фронтендерами;
- Стандарт (RFC 7807);
- Встроено в .NET.

Глобальную обработку ошибок, начиная с .NET 8, можно настроить с помощью IExceptionHandler, который также будет выдавать ProblemDetails.

Источник: https://thecodeman.net/posts/better-error-handling-with-problemdetails
  • 👍 16
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →