Когда IExceptionHandlerPathFeature может иметь значение null с ExceptionHandlerMiddleware в Asp.Net Core

Microsoft предоставляет этот пример для ExceptionHandlerMiddlewareздесь. Это отрывок:

app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        ...

        var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();

        if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
        {
            await context.Response.WriteAsync("File error thrown!");
        }

        ...
    });
});

Я не совсем понимаю, зачем им использовать оператор ?. для получения исключения? Можно ли запустить этот делегат без IExceptionHandlerPathFeature? Не кажется логичным иметь обработчик исключений без гарантированного доступа к исключению.

Здесь — это код, и не представляется возможным иметь там нуль.

если IExceptionHandlerPathFeature реализация не может быть найдена для чтения, то это может быть null

Ehsan Sajjad 14.03.2019 16:45

Теоретически это возможно, но это просто POCO в упражняться

Ilya Chernomordik 14.03.2019 16:49

Это не ошибка, которая может быть нулевой, а exceptionHandlerPathFeature, если она не найдена в коллекции context.Features

Chris Pratt 14.03.2019 16:50

да, и это может быть null как я вижу, но я точно не знаю случаев на данный момент.

Ehsan Sajjad 14.03.2019 16:50

В обычных сценариях он никогда не будет нулевым. Тем не менее, вы можете реализовать IWebHostочень упрощенно, и это будет. Реализация по умолчанию будет иметь эту функцию, но это не значит, что все реализации будут. Кроме того, рекомендуется всегда кодировать вокруг нулей. Возможно, он никогда не будет нулевым, но для нулевого значения существует потенциал, так что этот случай покрывается. Возможно, это особенно важно для обработчика исключений, поскольку вы можете попасть в бесконечный цикл из-за того, что обработчик сам генерирует исключения.

Chris Pratt 14.03.2019 16:54

Да, я немного не так написал вопрос, я вижу :) Исправлю. Теперь зачем нам обработчик исключений, который не гарантирует способ получить доступ к исключению? Разве это не странно?

Ilya Chernomordik 14.03.2019 17:02

@ChrisPratt Не могу полностью согласиться с тем, что всегда рекомендуется кодировать против нуля, поскольку, на мой взгляд, это защитное программирование, и я бы предпочел увидеть исключение, чем получить совершенно неожиданный нуль. К счастью, в следующем C# будет немного лучше, когда null не будет разрешен, хотя это другое обсуждение в другой день :)

Ilya Chernomordik 14.03.2019 17:07

На самом деле строгая проверка нулевого значения в C# 8.0 не является обязательной. Это защитное кодирование, но в этом и смысл. Я не уверен, что вы подразумеваете под «неожиданными нулями», потому что, когда вы добавляете нулевую охрану, в этот момент никакой нуль не является «неожиданным». Исключения — это, безусловно, стратегия худший, тем более что NullReferenceExceptions — это исключительно исключения во время выполнения. В общем, полагаться на исключения плохо, и следует полностью избегать исключений во время выполнения.

Chris Pratt 14.03.2019 18:11

у меня ExceptionDetails имеет значение null в следующем коде: var ExceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

EKanadily 27.01.2021 11:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
1 414
1

Ответы 1

В моей конкретной ситуации у меня был собственный контроллер ошибок с одним из действий:

[Route("Error")]
public IActionResult Error(ErrorViewModel model)
{
    var exceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
    model.Code = 500;

    _logger.Error($"The path {exceptionDetails?.Path} threw an exception " +
         $"{exceptionDetails?.Error}");

    return View(nameof(Error), model);
}

IExceptionHandlerPathFeature был нулевым всякий раз, когда пользователь вручную вводит маршрут моей страницы с ошибкой в ​​браузере. Поэтому мне пришлось поставить нулевой условный оператор, чтобы ограничить исключение нулевой ссылки.

Другие вопросы по теме