c# - 如何在解析中实现异常处理?

标签 c# design-patterns logging error-handling

我正在创建一个解析应用程序,它解析大约 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(布局就会发生 随时间变化),我需要实现异常处理和 记录。我需要尽可能多地解析,并且必须记录错误。我知道 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; 
}

优点:易于实现

缺点:如果我在 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 函数,它接受委托(delegate)并在 try-catch block 中执行它,并记录 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
}

这是一个好的解决方案还是我正在重新发明一个方轮?

最佳答案

使用 SafeCall 选项,因为它很容易阅读,如果您想更改日志记录机制,您可以随时更改 SafeCall 实现。

关于c# - 如何在解析中实现异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708331/

相关文章:

c# - NHibernate session 工厂计数限制?

c# - 值(value)与引用

java 。编写一个模式将命令行分割成间隙

c++ - 这是什么设计模式?如何使用它?

node.js - 自定义记录器和 Socket.io 1.x

c# - c# 中的 HttpWebRequest 不适用于 .net 4.5

c# - ERR_CONNECTION_REFUSED - .Net Core 1.0.1

asp.net - 什么时候应该使用 session-per-request 模式

Pythonlogging.getLogger 在 AWS Glue python shell 作业中不起作用

ruby-on-rails - Rails 记录器格式字符串配置