質問

.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のソリューションの説明は問題ありません。

役に立ちましたか?

解決

GenerateHtml()呼び出し中に発生するエラーのみに関心があり、2番目のアプローチ(これは私には問題ないと思われる)が気に入らない場合は、終了スパンタグをfinallyブロックに移動して引き出してください。オープンコール:

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

これにより、スパンは常に開かれ、常に閉じられます。 GenerateHtmlが例外をスローする場合は、それを閉じる前に、キャッチして、スパン内でエラーを生成します。

もちろん、タグを書き込もうとして例外が発生した場合は、とにかくエラーメッセージを書くのは運が悪いので、他の場所で処理されていると仮定します。

他のヒント

try / catchの使用を避け、代わりに結果が期待したものでないかどうかを確認する必要があります。ここで確認できるのは、myHTMLがnullになる可能性があるためです。次のようなものを試してください。

string myHtml = myObject.GenerateHtml();

if (myHTML != null)
{
   htw.RenderBeginTag( HtmlTextWriterTag.Span );
   htw.Write(myHtml)     
   htw.RenderEndTag( );
else
{
   GenerateHtmlErrorMessage(htw);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top