Исключительная безопасность / обработка с .Net HtmlTextWriter? - PullRequest
0 голосов
/ 13 ноября 2008

Я использую .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 ]

1 голос
/ 15 ноября 2008

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

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

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

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

0 голосов
/ 13 ноября 2008

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

string myHtml = myObject.GenerateHtml ();

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