ASP.NET中点击嵌套Span的服务器端按钮重定向时抛出异常问题
首先咱们拆解下问题:你的取消按钮嵌套<span>标签的写法完全没问题,和后续的跳转异常没有关联,核心问题出在Response.Redirect的使用逻辑上。
为什么加了try-catch就出问题?
ASP.NET里的Response.Redirect("StartPage.aspx")默认等价于Response.Redirect(url, true)——第二个参数endResponse设为true时,会触发Response.End()方法,而这个方法会主动抛出ThreadAbortException来终止当前请求的线程,这是ASP.NET的预期行为。
当你没加try-catch的时候,ASP.NET运行时会自动捕获这个异常并忽略它,所以跳转能正常完成;但一旦你加了try-catch,这个异常就被你的代码捕获了,于是执行了catch块里跳转到Error.aspx的逻辑,这就是你看到“抛出异常”的本质(其实是捕获了预期内的异常,触发了错误页面跳转)。
解决方案
根据你的需求,有两种处理方式:
方式1:移除多余的try-catch(推荐)
既然这个取消按钮只是用来退出表单跳转,而且不加try-catch时功能正常,那完全可以去掉try-catch块。因为ThreadAbortException是ASP.NET的正常流程,不需要额外捕获处理:
Response.Redirect("StartPage.aspx");
方式2:正确使用带endResponse=false的Redirect(如果必须保留try-catch)
如果你因为日志需求一定要保留try-catch,那要修改Response.Redirect的调用方式,避免抛出ThreadAbortException,同时确保请求正常结束:
try { Response.Redirect("StartPage.aspx", false); // 告诉ASP.NET完成当前请求,不再执行后续页面生命周期代码 Context.ApplicationInstance.CompleteRequest(); } catch (Exception ex) { NLog.LogManager.GetCurrentClassLogger().Warn("Error happened", ex); Response.Redirect("Error.aspx", false); Context.ApplicationInstance.CompleteRequest(); }
这样既不会触发预期外的异常捕获,也能保证跳转逻辑正常执行,同时保留你的日志记录需求。
内容的提问来源于stack exchange,提问作者narutouzumaki 99

