Domanda

Sto usando un .Net HtmlTextWriter per generare HTML.

try
{
   htw.RenderBeginTag( HtmlTextWriterTag.Span );

   htw.Write(myObject.GenerateHtml());

   htw.RenderEndTag( );
}
catch (Exception e)
{
   GenerateHtmlErrorMessage(htw);
}

In questo esempio, se viene generata un'eccezione di errore durante myObject.GenerateHtml () , genererò un bell'errore html ma sarà preceduto da un span di apertura tag che non viene mai chiuso.

Potrei riformattare in questo modo

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);
}

Ora la mia apertura non si apre 'fino a quando non ho fatto il duro lavoro, ma questo mi sembra imbarazzante. Esiste un modo per eseguire il rollback con un HtmlWriter? Anche se ho dovuto caricare molti blocchi usando.

Attualmente sto lavorando in .Net 2.0, ma una discussione sulle soluzioni in 3.5 sarebbe ok.

È stato utile?

Soluzione

Se ti preoccupi solo degli errori che si verificano durante la chiamata GenerateHtml () e non ti piace il secondo approccio (che mi sembra soddisfacente), perché non spostare il tag span di chiusura in un blocco finally ed estrarre la chiamata aperta:

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

In questo modo l'intervallo è sempre aperto e sempre chiuso. Se GenerateHtml genera un'eccezione, la catturi e generi l'errore all'interno dell'intervallo, prima di chiuderlo.

Naturalmente, se si verifica l'eccezione durante il tentativo di scrivere i tag, allora sei sfortunato a scrivere un messaggio di errore, quindi assumerò che venga gestito altrove.

Altri suggerimenti

Dovresti evitare di usare try / catch e invece controlla se il risultato non è quello che ti aspettavi. L'unica cosa che posso vedere qui è che myHTML può essere nullo, quindi prova qualcosa del genere:

stringa myHtml = myObject.GenerateHtml ();

if (myHTML != null)
{
   htw.RenderBeginTag( HtmlTextWriterTag.Span );
   htw.Write(myHtml)     
   htw.RenderEndTag( );
else
{
   GenerateHtmlErrorMessage(htw);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top