Как передать нефатальные предупреждения из библиотеки - PullRequest
3 голосов
/ 19 марта 2010

Библиотечная функция анализирует файл и возвращает объект. Если синтаксический анализатор обнаруживает неизвестные данные, пропущенные значения и т. Д., Он не должен выдавать исключение и прекращать синтаксический анализ (поскольку это не является фатальным), но должен быть способ передачи информации об этих вещах вызывающей стороне (чтобы предупреждения например, в интерфейсе пользователя). Как эти предупреждения могут быть возвращены? Я думаю о передаче функции / объекта обратного вызова в библиотеку, есть ли другие возможные решения?

Ответы [ 5 ]

4 голосов
/ 19 марта 2010

У меня будет набор ошибок, легко доступных в парсере, что-то вроде этого:

public class Parser
{
   public bool HasErrors { 
     get { return ParseErrors != null && ParseErrors.Count > 0; } 
   }    
   public List<string> ParseErrors { get; set; }
   public object Parse(string fileName) {}
}

Или, конечно, какой бы тип ошибки вы ни хотели, может быть, что-то более подробное.

Код, вызывающий вашу библиотеку, будет выглядеть примерно так:

var p = new Parser();
var o = p.Parse("file.txt"); //Get object
if(p.HasErrors) //Uh oh, abort, do something with p.ParseErrors
1 голос
/ 19 марта 2010

в псевдокоде:

class ParseResult (
    Outcome <succesful, warnings, failed completely>,
    ParseOutput <result>,
    List<Warning> warnings
)

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

1 голос
/ 19 марта 2010

Хорошо, возвращаемый объект может содержать предупреждения. В веб-сервисах я обычно имею дело с классами-оболочками, например:

class Wrapper {
    List<Warning> Warnings { get; set; }
    bool HasWarnings { get { return Warnings != null && Warnings.Count > 0; } }
    MyObject Result { get; set; }
}

Таким образом, принимающая сторона будет решать, принимать ли меры по каким-либо предупреждениям, но из ее структуры человеку, вызывающему веб-сервисы, также становится очевидным, что может быть предупреждениями. , Возвращенный объект, подобный этому, в значительной степени требует некоторого базового уровня проверки ошибок на принимающей стороне.

1 голос
/ 19 марта 2010

Распространенным решением является предоставление предупреждений через соответствующую функцию. Таким образом, предупреждение будет прочитано только тогда, когда этого пожелает клиентский код.

0 голосов
/ 19 марта 2010

Если ваш язык программирования поддерживает это, я рекомендую использовать события для передачи предупреждений. Ваша вызывающая программа может перехватить событие и затем решить, что с ним делать, основываясь на серьезности или типе предупреждения, которое передается вместе с уведомлением о событии. В случае событий пользователю не нужно ждать завершения обработки всего файла, прежде чем он увидит, есть ли какие-либо ошибки. Если вы также предоставите метод отмены обработки файла, он может принять решение прекратить обработку, если решит, что возникшие ошибки достаточно серьезны.

...