2008-11-13 92 views
0

我正在使用.Net HtmlTextWriter來生成HTML。使用.Net HtmlTextWriter安全/處理異常?

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中的解決方案的討論是可以的。

回答

1

如果你只關心錯誤GenerateHtml()調用過程中發生的,不喜歡的第二種方法(這似乎沒什麼問題),爲什麼收盤跨度標籤沒有進入finally塊,並拔出公開呼叫:

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

這樣,跨度始終打開並始終關閉。如果GenerateHtml引發異常,則在關閉它之前抓住它並在跨度內生成錯誤。

當然,如果試圖編寫標籤的異常發生,那麼你運氣不好寫了一條錯誤消息,所以我會假設它正在其他地方處理。

-2

您應該避免使用try/catch,而是檢查結果是否與預期不符。這裏我唯一能看到的是myHTML可以爲null,所以試試這樣:

string myHtml = myObject.GenerateHtml();

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

當我的代碼可能拋出異常時,我該如何避免嘗試捕獲? – tpower 2008-11-13 09:43:44