2008-11-13 89 views
0

我正在使用.Net HtmlTextWriter来生成HTML。使用.Net HtmlTextWriter安全/处理异常?

try 
{ 
    htw.RenderBeginTag(HtmlTextWriterTag.Span); 

    htw.Write(myObject.GenerateHtml()); 

    htw.RenderEndTag(); 
} 
catch (Exception e) 
{ 
    GenerateHtmlErrorMessage(htw); 
} 

在这个例子中,如果一个错误异常被解雇myObject.GenerateHtml(),我会产生一个很好的错误HTML,但它会通过一个开口span标签是永远不会关闭之前。

我可以重构它像这样

try 
{ 
    string myHtml = myObject.GenerateHtml(); 

    // now hope we don't get any more exceptions 
    htw.RenderBeginTag(HtmlTextWriterTag.Span); 
    htw.Write(myHtml)  
    htw.RenderEndTag(); 
} 
catch (Exception e) 
{ 
    GenerateHtmlErrorMessage(htw); 
} 

现在我的跨度不开“,直到我已经完成了艰难的工作,但是这只是看起来很笨拙我。有什么办法可以用HtmlWriter回滚?即使我不得不使用块的负载。

我目前在.Net 2.0中工作,但在3.5中的解决方案的讨论是可以的。

回答

1

如果你只关心错误GenerateHtml()调用过程中发生的,不喜欢的第二种方法(这似乎没什么问题),为什么收盘跨度标签没有进入finally块,并拔出公开呼叫:

htw.RenderBeginTag(HtmlTextWriterTag.Span); 
try 
{ 
    htw.Write(myObject.GenerateHtml()); 
} 
catch (Exception e) 
{ 
    GenerateHtmlErrorMessage(htw); 
} 
finally 
{ 
    htw.RenderEndTag(); 
} 

这样,跨度始终打开并始终关闭。如果GenerateHtml引发异常,则在关闭它之前抓住它并在跨度内生成错误。

当然,如果试图编写标签的异常发生,那么你运气不好写了一条错误消息,所以我会假设它正在其他地方处理。

-2

您应该避免使用try/catch,而是检查结果是否与预期不符。这里我唯一能看到的是myHTML可以为null,所以试试这样:

string myHtml = myObject.GenerateHtml();

if (myHTML != null) 
{ 
    htw.RenderBeginTag(HtmlTextWriterTag.Span); 
    htw.Write(myHtml)  
    htw.RenderEndTag(); 
else 
{ 
    GenerateHtmlErrorMessage(htw); 
} 
+0

当我的代码可能抛出异常时,我该如何避免尝试捕获? – tpower 2008-11-13 09:43:44