如何在捕获异常后在页面或消息框中显示错误码及错误信息?
.NET中捕获异常后向页面展示友好错误信息的方案
核心原则
- 给普通用户展示友好、非技术化的提示,避免暴露系统内部错误细节
- 后台完整记录异常详情(如堆栈、错误类型),用于排查问题
- 可通过错误码关联用户反馈与后台日志,方便定位问题
具体实现方案
1. 定义统一错误码与提示信息
提前用静态类维护业务相关的错误码和对应提示,便于统一管理:
public static class ErrorCodes { public const string PayModeLoadFailed = "PAYMODE_001"; public static string GetErrorMessage(string errorCode) { return errorCode switch { PayModeLoadFailed => "支付方式加载失败,请稍后重试或联系客服", _ => "操作失败,请稍后重试" }; } }
2. 在异常捕获中传递错误信息
结合你提供的PayModeItems方法,针对不同.NET Web场景修改实现:
场景1:ASP.NET MVC Controller中
public ActionResult LoadPayModes() { try { List<SelectListItem> paymodeList = new List<SelectListItem>(); paymodeList.Add(new SelectListItem { Text = "CASH", Value = "1" }); paymodeList.Add(new SelectListItem { Text = "CARD", Value = "20" }); paymodeList.Add(new SelectListItem { Text = "BANK TRANSFER", Value = "3" }); ViewBag.PayModes = paymodeList; return View(); } catch (Exception ex) { // 记录详细异常日志 string logFilePathTransactionSM = ConfigurationManager.AppSettings["LogFilePathTransactionSendMoney"]; LogtoXmlService.LogServiceErrorWithDetails(ex, "SendMoneyController", "PayModeItems", logFilePathTransactionSM, "SendMoney"); // 传递错误码和友好提示到前端 ViewBag.ErrorCode = ErrorCodes.PayModeLoadFailed; ViewBag.ErrorMessage = ErrorCodes.GetErrorMessage(ErrorCodes.PayModeLoadFailed); // 返回原页面展示错误 return View(); } }
场景2:Web API接口中(返回统一响应)
如果是API接口,返回包含错误信息的统一响应模型:
public class ApiResponse<T> { public bool Success { get; set; } public T Data { get; set; } public string ErrorCode { get; set; } public string ErrorMessage { get; set; } } [HttpGet] public ApiResponse<List<SelectListItem>> PayModeItems() { try { List<SelectListItem> paymodeList = new List<SelectListItem>(); // 初始化列表逻辑... return new ApiResponse<List<SelectListItem>> { Success = true, Data = paymodeList }; } catch (Exception ex) { // 记录日志 string logFilePathTransactionSM = ConfigurationManager.AppSettings["LogFilePathTransactionSendMoney"]; LogtoXmlService.LogServiceErrorWithDetails(ex, "SendMoneyController", "PayModeItems", logFilePathTransactionSM, "SendMoney"); return new ApiResponse<List<SelectListItem>> { Success = false, ErrorCode = ErrorCodes.PayModeLoadFailed, ErrorMessage = ErrorCodes.GetErrorMessage(ErrorCodes.PayModeLoadFailed) }; } }
3. 前端页面展示错误信息
MVC Razor视图中
在页面合适位置添加错误展示区域:
@if (!string.IsNullOrEmpty(ViewBag.ErrorMessage)) { <div class="alert alert-danger"> <strong>错误提示:</strong> @ViewBag.ErrorMessage @if (!string.IsNullOrEmpty(ViewBag.ErrorCode)) { <span class="text-muted">(错误码:@ViewBag.ErrorCode)</span> } </div> } <!-- 支付方式下拉框 --> @Html.DropDownList("PayMode", ViewBag.PayModes as IEnumerable<SelectListItem>, "请选择支付方式", new { @class = "form-control" })
API前端(AJAX调用)
前端通过AJAX调用API时,在回调中处理错误展示:
$.get("/SendMoney/PayModeItems") .done(function(response) { if (response.Success) { // 渲染下拉框 let select = $("#PayMode"); select.empty(); response.Data.forEach(item => { select.append(`<option value="${item.Value}">${item.Text}</option>`); }); } else { // 展示错误信息 $("#errorContainer").html(`<div class="alert alert-danger">${response.ErrorMessage} (错误码:${response.ErrorCode})</div>`); } }) .fail(function() { $("#errorContainer").html(`<div class="alert alert-danger">网络异常,请稍后重试</div>`); });
4. 全局异常处理(可选)
配置全局异常过滤器,统一处理未捕获的异常并跳转错误页:
public class CustomExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext filterContext) { if (!filterContext.ExceptionHandled) { // 记录日志 var ex = filterContext.Exception; // 日志记录逻辑... // 设置错误信息并跳转错误页 filterContext.Controller.ViewBag.ErrorMessage = "系统出现异常,请稍后重试"; filterContext.Result = new ViewResult { ViewName = "Error" }; filterContext.ExceptionHandled = true; } } } // 在Global.asax中注册 protected void Application_Start() { GlobalFilters.Filters.Add(new CustomExceptionFilter()); }
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

