2010-09-14 8 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; 
} 

Плюсы: Простота внедрения

Минусы: если я получаю отл в 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 
} 

это хорошее решение, или я буду изобретать квадратное колесо

+1

что код для разбора отдельных значений? Он чувствует, что между разными значениями будут общие черты, и я буду придерживаться обработки ошибок и регистрации там. – Grzenio

+0

@ Grzenio, логическая синтаксическая разборка значений DIFFRENT. –

+0

Кажется, что ваши методы синтаксического анализа делают слишком много. Если важно, чтобы каждая часть имела обработку ошибок, почему бы вам не разделить логику на более гранулированные методы, которые содержат собственную обработку/регистрацию исключений? –

ответ

2

Пойдите с опцией SafeCall, поскольку он работает, легко читается, и вы всегда можете изменить реализацию SafeCall, если хотите изменить механизм ведения журнала.

1

Я бы сказал, что защитное кодирование в терминах XP будет «решением» в вашем случае.

  • То есть проверка UIElement! = NULL перед разбором любых значений из expeceted элемента пользовательского интерфейса. Поскольку пользователь имеет тенденцию изменять разметку HTML. (Я испытал это в своем приложении для очистки экрана)

  • Таким образом, вам не нужно использовать несколько блоков catch try для разбора разных значений.

  • Вы можете просто загрузить DOM и пройти по интересующему узлу (UIElement) и проанализировать только ненулевые элементы.

Обратитесь к Best practices for Exception Handling от Microsoft.

Я считаю, что вы просто хотите пропустить узлы, которые не были найдены, от разбора.

Надеется, что это помогает,

Спасибо,

Виджай

+0

Да, я хочу пропустить узлы, которые не могут быть проанализированы (вроде). Я не хочу использовать нулевые проверки, потому что обычно я должен проверить это: XpathQuery Result, Regex Result, Collection Length, а иногда и все вместе. –