我正在使用.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回滚?即使我必须放入大量的using块。
我目前使用的是.Net 2.0,但是可以在3.5中讨论解决方案。
发布于 2008-11-15 08:06:05
如果您只关心在GenerateHtml()调用过程中发生的错误,而不喜欢第二种方法(对我来说似乎没问题),为什么不将关闭的span标记移到一个finally块中,并取出打开的调用:
htw.RenderBeginTag( HtmlTextWriterTag.Span );
try
{
htw.Write(myObject.GenerateHtml());
}
catch (Exception e)
{
GenerateHtmlErrorMessage(htw);
}
finally
{
htw.RenderEndTag( );
}这样,跨度始终处于打开和关闭状态。如果GenerateHtml抛出异常,您将捕获它并在关闭它之前在跨度内生成错误。
当然,如果在尝试编写标记时发生异常,那么无论如何您都不会编写错误消息,所以我将假定这是在其他地方处理的。
发布于 2008-11-13 09:41:52
您应该避免使用try/catch,而应检查结果是否与您预期的不同。我在这里看到的唯一一件事是,myHTML可以是空的,所以尝试如下所示:
string myHtml = myObject.GenerateHtml();
if (myHTML != null)
{
htw.RenderBeginTag( HtmlTextWriterTag.Span );
htw.Write(myHtml)
htw.RenderEndTag( );
else
{
GenerateHtmlErrorMessage(htw);
}https://stackoverflow.com/questions/286619
复制相似问题