controller 手动抛出异常
``` using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using WebApplication3.Utility.Filter;
namespace WebApplication3.Controllers {
public class ThirdController : Controller
{
[TypeFilter(typeof(CustomExceptionFilter))]
public IActionResult Index3()
{
throw new Exception("故意抛的");
}
}
}
```
创建异常处理类 CustomExceptionFilter
``` using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ViewFeatures; using NuGet.Protocol.Plugins;
namespace WebApplication3.Utility.Filter { public class CustomExceptionFilter : Attribute, IExceptionFilter/, IAsyncExceptionFilter/ {
private readonly IModelMetadataProvider model;
public CustomExceptionFilter(IModelMetadataProvider model) {
this.model = model;
}
/// <summary>
/// 当有异常发生时,就会触发到这里
/// </summary>
/// <param name="context"></param>
/// <exception cref="NotImplementedException"></exception>
public void OnException(ExceptionContext context)
{
Console.WriteLine("同步异常处理");
if (context.ExceptionHandled == false)
{
//在这里处理异常
if (IsAjaxRequest(context.HttpContext.Request))
{
// 返回json
context.Result = new JsonResult(new
{
Success = false,
Message = context.Exception.Message,
});
}
else
{
// 返回页面
ViewResult result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
result.ViewData = new ViewDataDictionary(model, context.ModelState);
result.ViewData.Add("Exception", context.Exception);
// 断路器,只要对Result就不继续往后了
context.Result = result;
}
// 表示当前异常被处理
context.ExceptionHandled = true;
}
}
private bool IsAjaxRequest(HttpRequest request)
{
string header = request.Headers["X-Requested-With"];
return "XMLHttpRequest".Equals(header);
}
/// <summary>
/// 当有异常发生时,就会触发到这里,异常处理默认选择异步
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
/* public Task OnExceptionAsync(ExceptionContext context)
{
Console.WriteLine("异步异常处理");
throw new NotImplementedException();
}*/
}
}
```
异常页面 Error.cshtml
``` @model ErrorViewModel @{ ViewData["Title"] = "Error"; Exception exception = ViewData["Exception"] as Exception; }
Error.
@if (exception != null) {
@exception.Message
}```