Exception sécurité / traitement avec .Net HtmlTextWriter?
-
08-07-2019 - |
Question
J'utilise un HTML
HtmlTextWriter
pour générer du code HTML.
try
{
htw.RenderBeginTag( HtmlTextWriterTag.Span );
htw.Write(myObject.GenerateHtml());
htw.RenderEndTag( );
}
catch (Exception e)
{
GenerateHtmlErrorMessage(htw);
}
Dans cet exemple, si une exception d'erreur est déclenchée pendant myObject.GenerateHtml ()
, je générerai une belle erreur html, mais elle sera précédée par une ouverture span
. tag qui n'est jamais fermé.
Je pourrais le refactorer comme si
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);
}
À présent, mon champ d'action ne s'ouvre pas tant que le travail n'a pas été accompli, mais cela me semble gênant. Est-il possible de revenir en arrière avec un HtmlWriter? Même si je devais mettre des tonnes de blocs en utilisant.
Je travaille actuellement sur .Net 2.0, mais une discussion des solutions dans la version 3.5 serait acceptable.
La solution
Si vous êtes uniquement préoccupé par les erreurs qui se produisent lors de l'appel de GenerateHtml () et que vous n'aimez pas la deuxième approche (ce qui me semble bien), pourquoi ne pas déplacer la balise de fermeture dans un dernier bloc, puis retirez-la l'appel ouvert:
htw.RenderBeginTag( HtmlTextWriterTag.Span );
try
{
htw.Write(myObject.GenerateHtml());
}
catch (Exception e)
{
GenerateHtmlErrorMessage(htw);
}
finally
{
htw.RenderEndTag( );
}
De cette façon, la plage est toujours ouverte et toujours fermée. Si GenerateHtml lève une exception, vous la récupérez et générez l'erreur à l'intérieur de la plage avant de la fermer.
Bien sûr, si l’exception survient lorsqu’elle tente d’écrire les balises, vous n’aurez pas de chance d’écrire un message d’erreur quand même, alors je suppose que cela est géré ailleurs.
Autres conseils
Évitez d'utiliser try / catch et vérifiez plutôt si le résultat obtenu n'est pas conforme à vos attentes. La seule chose que je peux voir ici, c'est que myHTML peut être nul, alors essayez quelque chose comme ceci:
string myHtml = myObject.GenerateHtml ();
if (myHTML != null)
{
htw.RenderBeginTag( HtmlTextWriterTag.Span );
htw.Write(myHtml)
htw.RenderEndTag( );
else
{
GenerateHtmlErrorMessage(htw);
}