Процедура обработки исключений (catch, log, report, fix) в настольном приложении для конечного пользователя - PullRequest
1 голос
/ 10 февраля 2010

Я начинаю новый проект, приложение для конечного пользователя. Я обеспокоен тем, что произойдет, если (хорошо, когда) конечный пользователь получит необработанное исключение. Попросить пользователя помочь мне воспроизвести ошибку не является приемлемым вариантом. На мой взгляд, у меня есть один вариант: загрузить отчет об ошибке на мой сервер.

Несколько лет назад, когда я был разработчиком на Delphi, мне мог бы помочь отличный инструмент под названием madExcept, но я не могу найти аналогичный инструмент в .Net framework. Так что я думаю, что я должен сделать свой собственный.

Вот моя идея

  • Используйте лог-фреймворк и напишите несколько хорошо продуманные записи журнала, не слишком много или мало. Просто войдите в память, лучшая производительность и мне не нужно файл. Ограничьте размер журнала до 100 КБ.

  • Используйте AOP для регистрации параметров и возврата значений во всех методах, кроме тех, которые находятся в жестком цикле, поскольку это загромождает журнал и приводит к плохой производительности. Это вопрос, в котором я действительно не уверен, глупо ли это делать на производстве? Хотя выгода кажется очень привлекательной. Я думаю, что я должен быть в состоянии воспроизвести исключение в гораздо большем количестве случаев, чем при наличии только трассировки стека и журнала. Также это будет записано в память и ограничено чем-то вроде 200 КБ.

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

Как вы думаете, это будет работать? Есть ли лучший способ?

Спасибо

1 Ответ

1 голос
/ 10 февраля 2010

Ожидаете ли вы иметь много необработанных исключений?

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

public void OpenConfigurationFile(string filePath)
{
    try
    {
        File.Open(filePath, ...);
    }
    catch (IOException ex)
    {
        throw new InvalidOperationException(
            String.Format("Can't open configuration file {0}", filePath), ex);
    }
}

Таким образом, вы не только зарегистрируете FileNotFoundException, но и тот факт, что это был файл конфигурации, который вы пытались открыть.

...