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中设置全局和局部的异常处理,以便更好地捕获和处理应用程序中的错误。

相关推荐
浪里行舟几秒前
告别“拼接”,迈入“原生”:文心5.0如何用「原生全模态」重塑AI天花板?
前端·javascript·后端
aiopencode12 分钟前
TCP 数据流分析全流程,从底层抓包到协议还原的实战指南
后端
期待のcode14 分钟前
Springboot主配置文件
java·spring boot·后端
雾林小妖1 小时前
springboot实现跨服务调用/springboot调用另一台机器上的服务
java·spring boot·后端
Code88481 小时前
观察Springboot AI-Function Tools 执行过程
人工智能·spring boot·后端
小蜜蜂dry1 小时前
从零到一,记录docker运行一个web端项目
后端
Felix_XXXXL2 小时前
MySQL----case的用法
java·后端
星光一影2 小时前
基于SpringBoot与Vue的海外理财系统设计与实现
vue.js·spring boot·后端·mysql·node.js·html5
晞微2 小时前
实战|SpringBoot+Vue3 医院智能预约挂号系统(含 AI 助手)
人工智能·spring boot·后端
silver98862 小时前
docker容器和分布式事务
后端