2010-09-14 23 views
3

我正在創建一個解析應用程序,解析〜20個網站,每個〜7-15個值。僞代碼的樣子:如何在解析中實現異常處理?

ParserA : ParserBase 
{ 
public override SomeEntity Parse(...) 
{ 
SomeEntity se = new SomeEntity(); 

//some code, parsing value1; 
//some code, parsing value1; 
//some code, parsing value1; 

//some code, parsing value2; 
//some code, parsing value2; 
//some code, parsing value2; 

//some code, parsing value3; 
//some code, parsing value3; 
//some code, parsing value3; 

//some code, parsing value4; 
//some code, parsing value4; 
//some code, parsing value4; 

... 

return se; 
} 
} 

ParserB : ParserBase {...} 
ParserC : ParserBase {...} 
... 

只要解析器從來沒有與HTML做得很好(佈局發生 時間內改變),我需要實現exceptionHandling和 記錄。我需要儘可能地解析,並且必須記錄錯誤。我知道2種方式來對付它:

public override SomeEntity Parse(...) 
{ 
SomeEntity se = new SomeEntity(); 

try { 
//some code, parsing value1; 
//some code, parsing value1; 
//some code, parsing value1; 

//some code, parsing value2; 
//some code, parsing value2; 
//some code, parsing value2; 

//some code, parsing value3; 
//some code, parsing value3; 
//some code, parsing value3; 

//some code, parsing value4; 
//some code, parsing value4; 
//some code, parsing value4; 

... 
} 
catch (Exception e) 
{ 
//Log 
} 
return se; 
} 

優點:易於實施

缺點:如果我在值5得到EXC,我沒有機會來解析value6,7,..等

2)

ParserA : ParserBase 
{ 
public override SomeEntity Parse(...) 
{ 
try 
{ 
//some code, parsing value1; 
//some code, parsing value1; 
//some code, parsing value1; 
} 
catch(Exception e) 
{ 
// Log 
} 

try 
{ 
//some code, parsing value2; 
//some code, parsing value2; 
//some code, parsing value2; 
catch(Exception e) 
{ 
// Log 
} 

try 
{ 
//some code, parsing value3; 
//some code, parsing value3; 
//some code, parsing value3; 
catch(Exception e) 
{ 
// Log 
} 

try 
{ 
//some code, parsing value4; 
//some code, parsing value4; 
//some code, parsing value4; 
catch(Exception e) 
{ 
// Log 
} 

... 

} 
} 

優點:一切,可被解析,解析;

缺點:太多copypaste(記得20個解析器,每7-15值

我想少寫,做多了,所以我實現Safecall函數,它接受委託,並執行它一試內。 -catch塊和日誌加時賽所以我現在寫這篇文章:。

SafeCall(() => { 
//some code, parsing value4; 
//some code, parsing value4; 
//some code, parsing value4; 
}); 

,而不是這樣:

try 
{ 
//some code, parsing value4; 
//some code, parsing value4; 
//some code, parsing value4; 
catch(Exception e) 
{ 
// Log 
} 

這是一個很好的解決方案,否則我重塑一個正方形輪

+1

什麼是解析單值碼?感覺不同值之間會有共同點,我會堅持錯誤處理和登錄。 – Grzenio 2010-09-14 11:23:35

+0

@Grzenio,值的解析邏輯是DIFFRENT。 – 2010-09-14 11:38:12

+0

看起來你的解析方法做得太多了。如果每個部分都有錯誤處理很重要,那麼爲什麼不將邏輯分成更細粒度的方法,這些方法包含自己的異常處理/日誌記錄? – 2010-09-14 11:47:13

回答

2

使用SafeCall選項工作時很容易閱讀,如果要更改記錄機制,則始終可以更改SafeCall實現。

1

我會說在XP中的防禦性編碼將是'你'的解決方案。

  • 即從expeceted UI元素分析任何值之前檢查的UIElement!= NULL。因爲用戶傾向於更改HTML標記。 (我已經在我的屏幕抓取應用程序中體驗到了這一點)

  • 這樣您就不必使用多個try catch塊來解析不同的值。

  • 您可以簡單地加載DOM並遍歷感興趣的節點(UIElement)並僅解析非空元素。

請參閱Microsoft的Best practices for Exception Handling

我認爲你只是想跳過未找到的節點解析。

希望這有助於

感謝,

維傑

+0

是的,我想跳過無法解析(排序)的節點。 我不想使用空檢查,因爲通常我必須檢查:XpathQuery結果,正則表達式結果,集合長度,有時 - 所有這些一起。 – 2010-09-14 12:04:52