Поместить < скрипт> внизу страницы, затем 4.
< script type = "text / javascript"> window.addEventListener ('load', function () {helium.init ();}, false); < / script>
Сообщения об ошибках должны быть записаны в stderr или Console.Error, а нормальный вывод - в стандартный вывод Console.Out. Это особенно важно для консольных приложений типа «фильтр», чей вывод (stdout) может быть передан другому процессу, например, в пакетном файле.
Обычно, если вы столкнулись с ошибкой, напишите сообщение об ошибке в Console.Error и верните ненулевой результат. Или, если это исключение, просто не беспокойтесь о его обработке.
Чтобы вернуть код результата, вы можете передать его в качестве аргумента в Environment.Exit, установить свойство Environment.ExitCode или вернуть ненулевое значение from main.
Для простых консольных приложений я хотел бы:
иметь вспомогательный класс для анализа командной строки.
иметь класс фасадов, который предоставляет тестируемый API для функциональности, реализованной вашим инструментом командной строки. Как и большинство .NET API, это обычно выдает исключение, если возникает ошибка.
основная программа просто использует помощник для анализа командной строки и вызывает API, передавая аргументы, переданные из командной строки. Он может перехватывать исключения, генерируемые API, регистрировать их, записывать ориентированное на пользователя сообщение об ошибке в Console.Error и устанавливать ненулевой код возврата.
Но я не считаю, что это единственный верный путь: на самом деле это не такая вещь, поэтому вы вряд ли найдете книгу, которую ищете.
Что касается того, как реализовать синтаксический анализ команд, я успешно использовал рефлексию и делегатов раньше. То, как это работает, - это украшать методы команд специальным атрибутом, который вы создаете сами, который утверждает, что метод должен вызываться пользователем, либо через имя метода, либо через строку, указанную в атрибуте, например:
[Command("quit")]
public void QuitApp()
{
...
}
При запуске программы вы можете сканировать класс для таких методов и хранить делегаты, которые предназначаются для них в словаре, где ключи - команды. Это облегчает синтаксический анализ команд на основе поиска первого слова в словаре (амортизированный O (1)) и легко расширяется и обрабатывается в будущем, так как новые команды добавляются простым добавлением отдельных методов.
Я решил написать несколько консольных служебных приложений в виде оконных приложений вместо консольных приложений. Как правило, я добавляю таймер для отсрочки начального запуска и просто добавляю кнопку отмены с индикатором прогресса, что позволяет использовать более интуитивно понятную опцию отмены. Вы также можете выводить данные на консоль таким же образом.
Для обработки в командной строке проверьте Mono.GetOptions. Это позволяет легко заполнять переменные из короткой (-f style) и длинной (--file style) опций командной строки.
Что касается аргументов командной строки, вы найдете различные схемы, но я всегда был поклонником
app.exe "self-explanatory arg" /noArgumentSwitch /argumentSwitch="argument"
Что касается кода возврата, вы можете изменить подпись своего Функция Main ()
возвращает int
вместо void
. Это позволит вам вернуть код вызывающему процессу, если необходимо.
Что касается потока ошибок, я лично никогда не использовал его и не думаю, что это должно происходить за счет вывода информации об ошибках. в стандартном потоке вывода. Вероятно, его лучше использовать для информации об отладке конкретных ошибок.