2010-04-20 54 views
1

我刚刚开始使用ASP.Net。我复制了一个前同事的代码(来自.net 1.1时代),如果发生错误,它的编号为Response.End();。还有一个:我是否需要ASP.Net 2.0中的Response.End()

 catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
      Response.End(); 
     } 

Page_Load(object sender, System.EventArgs e)到底哪总是附加"Thread was aborted."或类似的东西在最后。我怀疑之前的工作方式不同,或者错误条件未得到很好的测试。

无论如何,我能够在不喜欢GET参数的情况下停止使用Response.End();,并且使用return;代替。这似乎是在一个简单的案例中进行正确的思考。

这是一般的吗?

有一些问题,我复制的代码,但我不想做一个重写;我只想让它先运行并稍后找到皱纹。 Response.End();对我造成了精神障碍,所以我想弄明白。

我想保持包罗万象的条款,以防万一,至少现在是这样。我也可以结束法:

 catch (System.Threading.ThreadAbortException) 
     { 
      Response.End(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
      Response.End(); 
     } 

但这似乎只是愚蠢至极,一旦你想想所有的异常的产生。

请给我几句智慧。随意询问是否有不清楚的地方。谢谢!

P.S.以前的同事并没有被解雇,而且是一个很好的编码员 - 再次重用他的例子的另一个理由。

回答

3
catch (System.Threading.ThreadAbortException) 
    { 
     Response.End(); 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message); 
     Response.End(); 
    } 

这实际上不会工作。ThreadAbortException是一种特殊情况例外,当你的catch块完成后,it is automatically re-thrown

只需使用return肯定是最好的情况下,如果你是在方法是将在你的代码的条件下运行的最后一件事。如果不是,你想优雅地结束请求时,你可以调用HttpApplication.CompleteRequest(),这将跳过处理生命周期的其余部分,并直接跳转到EndRequest事件处理。

+0

它可能不会起作用,但是......它的确如此!另外,使用'Request.Flush();'和'return;'结合起来怎么样? – 2010-04-20 17:15:29

+1

对不起 - 我应该澄清。这将捕获异常,所以代码将做你想做的。但它不会抑制异常 - 它仍会传播到任何更高级别的异常处理,甚至更多。 使用Response.Flush()将简单地发送已写入响应流到浏览器的任何输出。只要请求完成处理就完成了,所以除非你有一个长时间的运行过程,否则没有多少意义。在某些情况下,如果您过早调用flush,它也可能会使某些ajax操作和会话创建变得复杂。 – womp 2010-04-20 17:31:55

+0

现在它变得更有意义。谢谢! – 2010-04-20 17:41:20

1

你不应该在这个级别捕捉你所有的异常。使用global.asax中的Application_Error事件来处理意外错误,并提供一个自定义错误页面以显示给客户端(请参阅web.config中的customError部分)。

一般情况下,你应该只抓住你应该处理异常,你不应该输出错误跟踪到你的用户。由于这种奇怪的错误处理技术,他只使用response.end。

+0

真...但它是供内部使用,这样我就可以半职业在这里。虽然很高兴知道。 – 2010-04-20 16:06:36

3

按照MSDN,所有这些调用不会是停止处理并返回当前的结果。因此,在处理结束时调用Response.End()应该不起作用。

在实践中,我只用这通过中止当前的处理方式中旬。

+0

如果我做了'Response.Write(“error”); Response.Flush();返回;'中途?这足够好吗?我仍然想保持所有的捕捉,就像看起来一样愚蠢。 – 2010-04-20 16:10:15

+0

像@Artiom提到的,如果有,将catch块后正常运行额外的处理,调用到Response.End()防止它运行。如果没有,你应该看到没有什么区别,从catch块中删除该行。添加一个'Response.Flush(); return;'将离开当前的Page_Load()方法,并允许任何其他后续页面生命周期方法正常触发。假设它们确实存在,'Response.End()'调用将阻止这些其他方法影响响应。 – 2010-04-20 17:16:33

1

以这种方式来看待..如果你的页面在页面生命周期(Page_Render,Page_PreRender)中有Page_Load之后运行的任何其他页面方法,或者在try-catch之后有任何其他代码 - 那么你应该保留Response.End()。

如果没有什么喜欢它 - 那么,如果你愿意,你可以删除它们,应该没有什么不同的发生。但考虑到这是一个旧的内部(即使遗留可能从.NET 1.1复制)的应用程序,不是自己写的,你可以将它们留在原地。它们一定不会伤害,并且可能会使你免于难以发现的奇怪问题,这通常在传统应用程序中发现:D