控制器中的错误处理

时间:2018-07-02 07:58:35

标签: error-handling exception-handling asp.net-core-2.0

我有这两个控制器动作

#1将抛出除以零的异常

public IActionResult About()
{
     ViewData["Message"] = "Your application description page.";
     var x = 0;
     var y = 5 / x;
     return View();
}

#2发生异常后,我希望在生产模式下调用此动作。

public IActionResult Error()
{
    var model = new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier };
    return View(model);
}

我有两个问题

  1. 当我处于VS Debug模式时,将使用app.UseDeveloperExceptionPage(),因此不会调用Error控制器(这对于开发环境而言很好)。
  2. 当我处于VS生产模式时,在视觉上使用app.UseDeveloperExceptionPage(),但我不知道如何确认真正使用的环境(startup.cs中的断点在生产模式下不起作用。)
  3. 如果以某种方式调用了错误操作,如何获取完整的异常消息(出于日志目的)?默认情况下,模型中仅存储RequestId。

我不想在每个动作或重复动作过滤器属性中使用try catch语法,因为我想像在核心版本之前的global.asax中那样实现一般的异常处理程序。

我的startup.cs非常简单。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseStatusCodePages();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

有什么主意吗?

2 个答案:

答案 0 :(得分:1)

要获取异常详细信息,您只需要:

var ex = HttpContext.Features.Get<IExceptionHandlerFeature>();

答案 1 :(得分:0)

我们可以使用下面的代码行

 var feature = HttpContext.Features.Get<IExceptionHandlerFeature>();
           var error = feature?.Error;
            _logger.LogError("Oops!", error);
            return View("~/Views/Shared/Error.cshtml", error);

您可以参考下面的链接以获取更多详细信息吗? Click