ASP.NET Core 入门教学六 异常设置

在ASP.NET Core中,异常处理是一个重要的部分,可以帮助我们捕获和处理应用程序中的错误。以下是如何在ASP.NET Core中设置异常处理的步骤:

1. 全局异常处理中间件

ASP.NET Core提供了一个中间件来捕获未处理的异常。你可以在Startup.cs文件中配置这个中间件。

复制代码
cs 复制代码
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

在这个例子中,app.UseExceptionHandler("/Home/Error")指定了当发生未处理的异常时,用户将被重定向到/Home/Error路径。

2. 自定义错误页面

你可以创建一个自定义的错误页面来显示错误信息。首先,创建一个Error.cshtml视图文件:

复制代码
cs 复制代码
@model ErrorViewModel

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
    <p><strong>Request ID:</strong> 在ASP.NET Core中,异常处理是一个重要的部分,可以帮助我们捕获和处理应用程序中的错误。以下是如何在ASP.NET Core中设置异常处理的步骤:

### 1. 全局异常处理中间件

ASP.NET Core提供了一个中间件来捕获未处理的异常。你可以在`Startup.cs`文件中配置这个中间件。

```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

在这个例子中,app.UseExceptionHandler("/Home/Error")指定了当发生未处理的异常时,用户将被重定向到/Home/Error路径。

2. 自定义错误页面

你可以创建一个自定义的错误页面来显示错误信息。首先,创建一个Error.cshtml视图文件:

复制代码
cs 复制代码
@model ErrorViewModel

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
    <p><strong>Request ID:</strong> <code>@Model.RequestId</code></p>
}

<p>
    <strong>Exception:</strong> @Model.Exception.Message
</p>

然后,在HomeController中添加一个Error动作方法:

复制代码
cs 复制代码
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Error()
    {
        var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        var exception = exceptionHandlerPathFeature?.Error;
        var statusCode = StatusCodes.Status500InternalServerError; // 默认为500

        // 根据异常类型设置状态码
        if (exception is FileNotFoundException)
        {
            statusCode = StatusCodes.Status404NotFound;
        }

        var errorViewModel = new ErrorViewModel
        {
            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier,
            Exception = exception,
            StatusCode = statusCode
        };

        return View(errorViewModel);
    }
}

3. 使用IExceptionHandler接口

如果你需要更复杂的异常处理逻辑,可以实现IExceptionHandler接口。首先,创建一个自定义的异常处理器:

复制代码
cs 复制代码
public class CustomExceptionHandler : IExceptionHandler
{
    public void HandleException(Exception ex)
    {
        // 在这里处理异常,例如记录日志、发送通知等
    }
}

然后,在Startup.cs中注册这个处理器:

复制代码
cs 复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSingleton<IExceptionHandler, CustomExceptionHandler>();
}

4. 使用ExceptionFilterAttribute

你还可以创建一个自定义的异常过滤器来处理控制器中的异常。首先,创建一个自定义的异常过滤器:

复制代码
cs 复制代码
public class CustomExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        // 在这里处理异常,例如记录日志、发送通知等

        // 设置结果以阻止进一步的异常处理
        context.Result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary<ErrorViewModel>(context.Exception),
            TempData = context.Controller.TempData
        };

        context.ExceptionHandled = true;
    }
}

然后,在控制器或动作方法上应用这个过滤器:

复制代码
cs 复制代码
[TypeFilter(typeof(CustomExceptionFilter))]
public class HomeController : Controller
{
    // ...
}

通过这些步骤,你可以在ASP.NET Core中设置全局和局部的异常处理,以便更好地捕获和处理应用程序中的错误。

相关推荐
面朝大海,春不暖,花不开15 分钟前
Spring Security默认配置覆盖指南
java·后端·spring
Java技术小馆1 小时前
打印高质量日志的10条军规
java·后端·面试
陈随易2 小时前
Element Plus 2.10.0 重磅发布!新增Splitter组件
前端·后端·程序员
陈随易3 小时前
2025年100个产品计划之第11个(哆啦工具箱) - 像哆啦A梦口袋一样丰富的工具箱
前端·后端·程序员
PetterHillWater3 小时前
Automa-RPA实现京东商品自动搜索
后端
肖笙XiaoSheng3 小时前
用Gemini调整我的定时任务代码
后端·aigc·ai编程
WindSearcher3 小时前
OAuth协议
后端
LanLance3 小时前
ES101系列09 | 运维、监控与性能优化
java·运维·后端·elasticsearch·云原生·性能优化·golang
Piper蛋窝3 小时前
我所理解的 Go 的 `panic` / `defer` / `recover` 异常处理机制
后端·go
clk66074 小时前
Spring Boot
java·spring boot·后端