【问题标题】:C# web api, how to handle exceptions and return appropriate status codeC# web api,如何处理异常并返回适当的状态码
【发布时间】:2020-02-11 10:58:05
【问题描述】:

我正在创建一个可能引发异常的 .net 核心 web api,在这种情况下,它无法通过 id 找到一个人。如果找不到此人,我会抛出自定义异常,例如NotFoundException。

是否有一个通用/全局的地方可以拦截此异常,然后返回 404 状态码。 而不是在每个控制器中编写自定义代码来处理所有不同的可能异常。我在想也许只是一个 ExceptionHelper 类,但想知道是否有更好的方法。理想情况下,我想在一个地方处理所有异常并根据异常返回不同的状态代码?

【问题讨论】:

    标签: c# exception .net-core webapi


    【解决方案1】:

    您可以在 Startup.csConfigure 方法中处理此问题。类似于以下内容:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseExceptionHandler(appBuilder =>
        {
            appBuilder.Run(async context =>
            {
                var exceptionHandlerFeature = context.Features.Get<IExceptionHandlerFeature>();
                if (exceptionHandlerFeature != null)
                {
                    var exception = exceptionHandlerFeature.Error;
                    if(exception == YourNotFoundException)
                    {
                        context.Response.StatusCode = 404;
                        await context.Response.WriteAsync("Could not find resource");
                    }
                    //you can also have global logging here eg:
                    //var logger = loggerFactory.CreateLogger("Global exception logger");
                    //logger.LogError(500, exception, exception.Message);
                }
                else
                {
                    context.Response.StatusCode = 500;
                    await context.Response.WriteAsync("an unexpected fault happened. Try again later.");
                }
    
            });
        });
        ...
    }
    

    然后在你的控制器中提出你的异常

    【讨论】:

    • 好的,所以尝试了这个,当我启动 Web 应用程序时可以看到 UseExceptionHandler 正在注册,但是当我从业务层抛出异常时,它不会进入此代码,而是返回 500 状态代码
    • 您是在配置方法的开头注册中间件吗?状态代码是通用的还是您在 exceptionHandler 中设置的?
    • 啊,谢谢,是的,上面定义的代码似乎停止了它的工作 app.UseDeveloperExceptionPage() 所以删除它及其工作,非常感谢
    • 我通常会通过if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else{ //the code snippet in my answer}来处理。
    猜你喜欢
    • 2018-04-27
    • 2012-09-21
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2015-10-28
    • 2011-11-27
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多