Я создаю приложение синтаксического анализа, которое анализирует ~ 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;
}
Плюсы: Простота внедрения
Минусы: если я получаю отл в value5, у меня нет возможности разобрать 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 блок и журналы 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
@ Grzenio, логическая синтаксическая разборка значений DIFFRENT. –
Кажется, что ваши методы синтаксического анализа делают слишком много. Если важно, чтобы каждая часть имела обработку ошибок, почему бы вам не разделить логику на более гранулированные методы, которые содержат собственную обработку/регистрацию исключений? –