我正在創建一個解析應用程序,解析〜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
}
這是一個很好的解決方案,否則我重塑一個正方形輪
什麼是解析單值碼?感覺不同值之間會有共同點,我會堅持錯誤處理和登錄。 – Grzenio 2010-09-14 11:23:35
@Grzenio,值的解析邏輯是DIFFRENT。 – 2010-09-14 11:38:12
看起來你的解析方法做得太多了。如果每個部分都有錯誤處理很重要,那麼爲什麼不將邏輯分成更細粒度的方法,這些方法包含自己的異常處理/日誌記錄? – 2010-09-14 11:47:13