【发布时间】:2011-04-12 02:54:56
【问题描述】:
我正在创建一个解析应用程序,它可以解析约 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(布局发生 期间更改),我需要实现异常处理和 记录。我需要尽可能多地解析,并且必须记录错误。我知道两种处理方法:
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;
}
优点:易于实施
缺点:如果我在 value5 处得到 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
}
...
}
}
优点:所有可以解析的东西都会被解析;
缺点:复制粘贴过多(记住 20 个解析器,每个解析器 7-15 个值。
我想少写多做,所以我实现了 Safecall 函数,它接受委托并在 try-catch 块中执行它,并记录 ot。所以现在我必须写这个:
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,值的解析逻辑不同。
-
看来你的解析方法做得太多了。如果每个部分都有错误处理很重要,为什么不将逻辑拆分成更细粒度的方法,包含它们自己的异常处理/日志记录?
-
你能把解析逻辑封装成实现相同接口的类吗?
标签: c# design-patterns logging error-handling