如何在静态类捕获异常时重定向页面并展示异常信息?
实现异常捕获后重定向首页并显示信息的方案
一、职责分离:数据访问层保持原有逻辑
你的静态数据访问方法无需直接处理页面重定向,它的核心职责是数据操作,UI交互逻辑应该交给上层处理。保留原有抛出异常的逻辑,让调用它的UI层/控制器来处理异常:
public static List<Stok> GetIndexStok(string dil, string SubeKodu, string anasayfa, string kisit) { using (BIRLIKB2BEntities db = new BIRLIKB2BEntities()) { try { List<Stok> LST = db.Database.SqlQuery<Stok>("exec [PRC_INDEX_STOK] @dbName, @isAnaSayfa,@Dil,@SubeKodu,@Kisit", new SqlParameter("@dbName", WebConfigurationManager.AppSettings["SERVER_USER"].ToString()), new SqlParameter("@isAnaSayfa", anasayfa), new SqlParameter("@Dil", dil), new SqlParameter("@SubeKodu", SubeKodu), new SqlParameter("@Kisit", kisit)).ToList(); return LST; } catch (Exception ex) { // 可在此处先记录异常日志(写入文件/数据库) // LogHelper.RecordError(ex); throw; // 将异常抛给上层处理 } } }
二、在UI层(控制器/页面)处理重定向和信息展示
根据你使用的ASP.NET技术类型,分别处理:
情况1:ASP.NET MVC
在调用GetIndexStok的控制器Action中捕获异常,将友好提示存入TempData(临时存储,仅单次请求有效),再重定向到首页:
public ActionResult StokList(string dil, string subeKodu, string anasayfa, string kisit) { try { var stokList = YourStaticClass.GetIndexStok(dil, subeKodu, anasayfa, kisit); return View(stokList); } catch (Exception ex) { // 记录详细异常日志 // LogHelper.RecordError(ex); // 存入友好提示,避免暴露敏感的原始异常信息 TempData["ErrorMessage"] = "获取库存数据时出现错误,请稍后重试。"; // 重定向到首页 return RedirectToAction("Index", "Home"); } }
然后在首页的View(如Index.cshtml)中读取TempData并展示:
@if (TempData["ErrorMessage"] != null) { <div class="alert alert-danger">@TempData["ErrorMessage"]</div> }
情况2:ASP.NET WebForms
在页面后台代码中捕获异常,将提示信息存入Session,再重定向到首页:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { try { string dil = Request.QueryString["dil"]; string subeKodu = Request.QueryString["SubeKodu"]; string anasayfa = Request.QueryString["anasayfa"]; string kisit = Request.QueryString["kisit"]; var stokList = YourStaticClass.GetIndexStok(dil, subeKodu, anasayfa, kisit); // 绑定数据到页面控件 GridView1.DataSource = stokList; GridView1.DataBind(); } catch (Exception ex) { // 记录详细异常日志 // LogHelper.RecordError(ex); Session["ErrorMessage"] = "获取库存数据失败,请稍后尝试。"; Response.Redirect("~/Default.aspx"); } } }
在首页(Default.aspx)的前台读取Session并展示,显示后清除Session避免重复展示:
<% if (Session["ErrorMessage"] != null) { %> <div style="color: red; padding: 10px; border: 1px solid #dc3545; border-radius: 4px;"> <%= Session["ErrorMessage"] %> <% Session.Remove("ErrorMessage"); %> </div> <% } %>
三、关键注意事项
- 安全防护:绝对不要直接将
ex.Message展示给用户,原始异常信息可能包含数据库连接字符串、SQL语句等敏感内容,必须使用自定义的友好提示。 - 日志记录:异常发生时一定要记录详细日志(如异常消息、堆栈跟踪、发生时间),方便后续排查问题。
内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez
相关产品推荐
相关产品推荐

