Exception 尝试捕获不适用于控制器到类库[调试器模式]

Exception 尝试捕获不适用于控制器到类库[调试器模式],exception,exception-handling,.net-core,Exception,Exception Handling,.net Core,我正在运行dotnet core 2。*正如标题所述,当从API调用时,我很难让我的try-catch正常工作。在任何人评论之前,我也在运行中间件来捕获任何异常。它的性能也没有达到预期 其他信息: 这两个类位于不同的名称空间/项目中 验证是静态的 它们都在同一个解决方案中 控制器: [AllowAnonymous] [HttpPost] public string Login([FromBody] AuthRequest req) { // See if the user exist

我正在运行dotnet core 2。*正如标题所述,当从API调用时,我很难让我的try-catch正常工作。在任何人评论之前,我也在运行中间件来捕获任何异常。它的性能也没有达到预期

其他信息:

  • 这两个类位于不同的名称空间/项目中
  • 验证是静态的
  • 它们都在同一个解决方案中
控制器

[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

    }
}
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)
    {
    }
}
querys.Authentication.GetUser代码

[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

    }
}
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)
    {
    }
}
检索异常

[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

    }
}
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))
    );
应用程序配置:

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))
    );
服务配置:

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))
    );

更新:在使用它之后,我注意到即使我的程序抛出异常,如果我按continue,API控制器也会像从未抛出异常一样处理它(就像它捕获异常并执行我想要的操作一样)。所以我关闭了中断异常设置,这在调试器模式下修复了它。然而,当我构建/发布程序时,这个中断似乎不是一个问题。这让我觉得这肯定是VisualStudio本身的问题,而不是代码的问题

当您将
ExceptionHandled
设置为
true
时,这意味着您已经处理了异常,不再存在错误。因此,尝试将其设置为
false

context.ExceptionHandled = false;
我同意这看起来有点混乱,你需要

相关说明:

  • 对于那些处理不同
    MVC
    API
    控制器的人,请确保您实现了适当的
    IEExceptionFilter
    ,因为它们有两个-
    System.Web.MVC.IEExceptionFilter
    (对于
    MVC
    )和
    System.Web.Http.Filters.IEExceptionFilter
    (对于
    API
  • 有一篇很好的文章介绍了如何实现异常过滤器
  • 还可以查看文档:(注意左侧页面菜单上方的选择器,选择
    ASP.NET Core 1.0
    ASP.NET Core 1.1
    ASP.NET Core 2.0
    ,或
    ASP.NET Core 2.1 RC1
    )。它有许多重要的注释和解释,解释了它为什么能这样工作
您是否为
Web API
配置了任何异常处理中间件
应用程序。使用中间件…
?如果是,请分享代码。@DmitryPavlov已更新。感谢Thanx。我使用了错误的异常过滤器