Исключительная безопасность / обработка с.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);
}