You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在捕获异常后在页面或消息框中显示错误码及错误信息?

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:16:10