Исключительная безопасность / обработка с.Net HtmlTextWriter?

Я использую.Net HtmlTextWriter генерировать 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 будет в порядке.

2 ответа

Решение

Если вас беспокоят только ошибки, возникающие во время вызова GenerateHtml(), и вам не нравится второй подход (который мне подходит), почему бы не переместить закрывающий тег span в блок finally и извлечь вызов open:

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

Таким образом, диапазон всегда открыт и всегда закрыт. Если GenerateHtml выдает исключение, вы перехватываете его и генерируете ошибку внутри диапазона перед его закрытием.

Конечно, если возникает исключение при попытке написать теги, вам все равно не повезло написать сообщение об ошибке, поэтому я предполагаю, что оно обрабатывается в другом месте.

Вам следует избегать использования try/catch и вместо этого проверять, не соответствует ли результат ожидаемому. Единственное, что я могу видеть здесь, это то, что myHTML может быть нулевым, поэтому попробуйте что-то вроде этого:

string myHtml = myObject.GenerateHtml ();

if (myHTML != null)
{
   htw.RenderBeginTag( HtmlTextWriterTag.Span );
   htw.Write(myHtml)     
   htw.RenderEndTag( );
else
{
   GenerateHtmlErrorMessage(htw);
}
Другие вопросы по тегам