C# web api、如何处理异常和return 适当的状态码
C# web api, how to handle exceptions and return appropriate status code
我正在创建一个 .net 核心网站 api,它可能会引发异常,在这种情况下,它无法通过 ID 找到一个人。如果找不到这个人,我会抛出一个自定义异常,例如NotFoundException.
有没有common/global地方可以拦截这个异常然后return一个404状态码。
而不是在每个控制器中编写自定义代码来处理所有不同的可能异常。我在想也许只是一个 ExceptionHelper class 也许,但想知道是否有更好的方法。理想情况下,我想在一个地方处理所有异常,并根据异常处理 return 不同的状态代码?
您可以在 Startup.cs
的 Configure
方法中处理此问题。类似于以下内容:
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.");
}
});
});
...
}
然后在您的控制器中引发异常
我正在创建一个 .net 核心网站 api,它可能会引发异常,在这种情况下,它无法通过 ID 找到一个人。如果找不到这个人,我会抛出一个自定义异常,例如NotFoundException.
有没有common/global地方可以拦截这个异常然后return一个404状态码。 而不是在每个控制器中编写自定义代码来处理所有不同的可能异常。我在想也许只是一个 ExceptionHelper class 也许,但想知道是否有更好的方法。理想情况下,我想在一个地方处理所有异常,并根据异常处理 return 不同的状态代码?
您可以在 Startup.cs
的 Configure
方法中处理此问题。类似于以下内容:
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.");
}
});
});
...
}
然后在您的控制器中引发异常