Try-Catch не работает для контроллера в библиотеку классов [Режим отладчика] - PullRequest
0 голосов
/ 14 мая 2018

Я использую dotnet core 2. * и, как упоминается в заголовке, у меня возникли проблемы с тем, чтобы уловить попытку выполнения при вызове из API.И прежде чем кто-то прокомментирует, я также запускаю промежуточное ПО для обнаружения любых исключений.Он также не работает должным образом

Дополнительная информация:

  • Два класса находятся в разных пространствах имен / проектах
  • Запросы. Аутентификация статическая.
  • Они оба находятся в одном решении

Контроллер :

[AllowAnonymous]
[HttpPost]
public string Login([FromBody] AuthRequest req)
{
    // See if the user exists
    if (Authenticate(req.username, req.password))
    {
        try {
            // Should Fail Below
            UserDetails ud = Queries.Authentication.GetUser(req.username);
        } catch (RetrievalException e){ }
          catch (Exception e){ } // Exception Still Comes Through

    }
}

Queries.Authentication.GetUser Code :

public static class Authentication { 

   public static UserDetails GetUser (string username)
   {
        // Some Code

        if (details.success)
        {
            // Some Code
        }
        else
        {
            throw new RetrievalException(details.errorMessage); // This is not caught propperly

        }
    }
}

Исключение получения :

public class RetrievalException : Exception
{
    public RetrievalException()
    {
    }

    public RetrievalException(String message)
        : base(message)
    {
    }

    public RetrievalException(String message, Exception inner)
        : base(message, inner)
    {
    }
}

РЕДАКТИРОВАТЬ: Добавление кода промежуточного программного обеспечения Здесь по запросу:

public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            HttpStatusCode status = HttpStatusCode.InternalServerError;
            String message = String.Empty;

            var exceptionType = context.Exception.GetType();
            if (exceptionType == typeof(UnauthorizedAccessException))
            {
                message = "Unauthorized Access";
                status = HttpStatusCode.Unauthorized;
            }
            else if (exceptionType == typeof(NullReferenceException))
            {
                message = "Null Reference Exception";
                status = HttpStatusCode.InternalServerError;
            }
            else if (exceptionType == typeof(NotImplementedException))
            {
                message = "A server error occurred.";
                status = HttpStatusCode.NotImplemented;
            }
            else if (exceptionType == typeof(RSClientCore.RetrievalException))
            {
                message = " The User could not be found.";
                status = HttpStatusCode.NotFound;
            }
            else
            {
                message = context.Exception.Message;
                status = HttpStatusCode.NotFound;
            }
            context.ExceptionHandled = true;

            HttpResponse response = context.HttpContext.Response;
            response.StatusCode = (int)status;
            response.ContentType = "application/json";
            var err = "{\"message\":\"" + message + "\",\"code\" :\""+ (int)status + "\"}";
            response.WriteAsync(err);
        }
    }

Конфигурация приложения:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        } else
        {
            app.UseExceptionHandler();
        }
        ...
     }

Конфигурация службы:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add Model View Controller Support
        services.AddMvc( config =>
            config.Filters.Add(typeof (CustomExceptionFilter))
    );

ОБНОВЛЕНИЕ: После игры с нимЯ заметил, что даже если моя программа выдает исключение, если я нажимаю «Продолжить», контроллер API обрабатывает его так, как если бы исключение не было выдано (так как оно ловит его и делает то, что я хочу).Таким образом, я отключил перерыв в настройках исключения, это исправило это в режиме отладчика.Однако этот перерыв, кажется, не является проблемой при сборке / публикации программы.Это заставляет меня думать, что это определенно проблема с самой Visual Studio, а не с кодом.

1 Ответ

0 голосов
/ 15 мая 2018

Когда вы устанавливаете ExceptionHandled в true, это означает, что вы обработали исключение, и больше не возникает никаких ошибок. Поэтому попробуйте установить его на false.

context.ExceptionHandled = false;

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

Соответствующие примечания:

  • Для тех, кто имеет дело с различными контроллерами MVC и API, убедитесь, что вы реализовали соответствующий IExceptionFilter, так как их два - System.Web.Mvc.IExceptionFilter (для MVC) и System.Web.Http.Filters.IExceptionFilter (для API ).
  • Есть хорошая статья о Обработка ошибок и внедрение зависимостей ExceptionFilter для API-интерфейсов ядра ASP.NET , которую можно использовать в качестве руководства для реализации фильтров исключений.
  • Также посмотрите документацию: Фильтры в ASP.NET Core (селектор заметок над левым меню страницы, чтобы выбрать ASP.NET Core 1.0, ASP.NET Core 1.1, ASP.NET Core 2.0 или ASP.NET Core 2.1 RC1). У него много важных замечаний и объяснений, почему он работает так, как работает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...