0

我正在使用 .NetHtmlTextWriter生成 HTML。

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 中的解决方案。

4

2 回答 2

1

如果您只关心 GenerateHtml() 调用期间发生的错误,并且不喜欢第二种方法(这对我来说似乎很好),为什么不将结束 span 标签移动到 finally 块中,并拉出 open 调用:

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

这样,跨度始终打开并始终关闭。如果 GenerateHtml 引发异常,您将捕获它并在 span 内生成错误,然后再关闭它。

当然,如果在尝试编写标签时发生异常,那么无论如何你都不会写出错误消息,所以我假设它正在其他地方处理。

于 2008-11-15T08:06:04.867 回答
-2

您应该避免使用 try/catch,而是检查结果是否与您的预期不同。我在这里唯一能看到的是 myHTML 可以为空,因此请尝试以下操作:

字符串 myHtml = myObject.GenerateHtml();

if (myHTML != null)
{
   htw.RenderBeginTag( HtmlTextWriterTag.Span );
   htw.Write(myHtml)     
   htw.RenderEndTag( );
else
{
   GenerateHtmlErrorMessage(htw);
}
于 2008-11-13T09:41:52.480 回答