视图中Try-Catch结果处理:如何在视图展示异常信息
解决方案:在视图中展示异常信息并保留原有提示
方案一:当前搜索页内直接展示(无需跳转,适合快速实现)
你用Console.WriteLine无效是因为它只输出到服务器控制台/日志,完全不会在前端页面显示;而原代码里的RedirectToAction会导致当前请求的上下文丢失,没法直接把异常信息传到目标视图。
修改控制器代码,不要跳转,直接返回当前搜索视图,用ViewData传递原有提示和异常信息:
try { return Ok(await _service.GetInformation(ID)); // 注意原代码里的`string ID`语法错误,要去掉string } catch (Exception ex) { _logger.Log(LogLevel.Critical, ex.GetExceptionDetails()); // 传递左右侧需要展示的内容 ViewData["LeftTip"] = "No data found with the parameters given"; ViewData["RightError"] = ex.Message; // 也可以用ex.GetExceptionDetails()获取更详细的异常信息 return View(); // 返回当前搜索视图,而非跳转 }
在对应的.cshtml视图里按布局渲染:
<div class="row"> <div class="col-md-6"> <p>@ViewData["LeftTip"]</p> </div> <div class="col-md-6"> <p class="text-danger">@ViewData["RightError"]</p> </div> </div>
方案二:自定义全局错误页(适合统一错误风格,长期维护)
如果你的项目需要全局统一的错误展示规范,自定义错误页是更合适的选择,也符合MVC的错误处理流程。
1. 创建自定义错误视图
在Views/Shared目录下新建Error.cshtml:
@model Microsoft.AspNetCore.Mvc.ViewFeatures.IExceptionHandlerPathFeature <div class="row"> <div class="col-md-6"> <p>@TempData["LeftTip"]</p> </div> <div class="col-md-6"> <p class="text-danger">@Model?.Error.Message</p> </div> </div>
2. 配置全局异常处理(Program.cs)
添加全局异常捕获中间件:
app.UseExceptionHandler("/Home/Error");
3. 修改HomeController的Error方法
public IActionResult Error() { var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>(); return View(exceptionFeature); }
4. 调整原控制器的Catch块
因为重定向是跨请求,ViewData会失效,改用TempData传递左侧提示,然后抛出异常让全局中间件捕获:
try { return Ok(await _service.GetInformation(ID)); } catch (Exception ex) { _logger.Log(LogLevel.Critical, ex.GetExceptionDetails()); TempData["LeftTip"] = "No data found with the parameters given"; throw; // 抛出异常触发全局错误处理 }
关键提醒
- Web场景下绝对不要用
Console.WriteLine展示前端错误,它只作用于服务器端。 - 跨请求传递数据要用
TempData,ViewData仅在当前请求有效。 - 若只是搜索功能单独的错误展示,方案一更高效;若需要全项目统一错误页,方案二更利于后续维护。
内容的提问来源于stack exchange,提问作者I.M.Groot
相关产品推荐
相关产品推荐

