исключение при ведении журнала в c #

module Feature
  def action
    puts "Feature"
  end
end

class Base
  include Feature
end 

После include Feature вам остается только переопределить методы экземпляра Feature, которые должны быть изменены, в том месте кода, где это необходимо.

Feature.define_method(:action) { "Patch" }
# other methods follow

Base.new.action
  #=> "Patch"
21
задан shA.t 24 November 2018 в 12:16
поделиться

4 ответа

Я обнаружил, что самый простой способ регистрации исключений в C# - вызвать метод ToString():

try
{

}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

Это обычно дает всю необходимую информацию, такую как сообщение об ошибке и трассировку стека, плюс дополнительную контекстную информацию, специфичную для исключения. (однако обратите внимание, что трассировка стека покажет вам только исходные файлы и номера строк, если ваше приложение скомпилировано с отладочной информацией)

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

Еще одно замечание - вам следует заменить ваш метод WriteLogError на полнофункциональный фреймворк логирования (например, Serilog) вместо того, чтобы пытаться написать свой собственный.

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

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

41
ответ дан 29 November 2019 в 06:54
поделиться

Ваше решение довольно хорошо. Я прошел ту же фазу
и в конечном счете должен был зарегистрировать все больше (она прибудет...):

  • регистрирующееся исходное местоположение
  • стек вызовов перед исключением (мог быть в действительно другом месте)
  • все внутренние исключительные ситуации таким же образом
  • идентификатор процесса / идентификационное
  • время потока (или запрашивают галочки)
  • для сети - URL, http заголовки, клиентский IP, cookie, веб-содержание сессии
  • некоторые другие критические значения переменных
  • загруженные блоки в памяти
  • ...

Предпочтительно в способе, которым я нажал на ссылку файла, где ошибка произошла,
или нажала на ссылку в стеке вызовов и Visual Studio, открытую в соответствующем местоположении.
(Конечно, все необходимо сделать, *.PDB файлы, где пути от кода IL
к выпущенному источнику в C # хранятся.)

, Таким образом, я наконец начал использовать это решение:
Это существует как пакет Nuget - Desharp.
Это для обоих типов приложения - сеть и рабочий стол.
Видят, что это документация GitHub Desharp . Это имеет много параметров конфигурации.

try {
    var myStrangeObj = new { /*... something really mysterious ...*/ };
    throw new Exception("Something really baaaaad with my strange object :-)");
} catch (Exception ex) {

    // store any rendered object in debug.html or debug.log file
    Desharp.Debug.Log(myStrangeObj, Desharp.Level.DEBUG);

    // store exception with all inner exceptions and everything else
    // you need to know later in exceptions.html or exceptions.log file
    Desharp.Debug.Log(ex);
}

Это имеет форматы журнала HTML, каждое исключение в одной строке,
, и от страницы HTML можно открыться в браузере, можно нажать
на файл, связываются и переходят к Visual Studio - это действительно захватывающе!
только необходимо установить этот редактор Desharp новичок .

См. некоторые демонстрации здесь:

Приложения MVC проверить любой из тех repos и зарегистрировать что-то между прочим выше.
тогда Вы видите зарегистрированные результаты в ~/Logs каталог. Главным образом что-либо настраивается.

1
ответ дан 29 November 2019 в 06:54
поделиться

Кроме того, когда вы, например, развертываете сборку выпуска своего кода в производственной среде, не забудьте включить файлы .pdb в пакет выпуска. Вам нужен этот файл, чтобы получить номер строки исключенного кода (см. Сколько информации содержат файлы pdb? (C # / .NET) )

4
ответ дан 29 November 2019 в 06:54
поделиться

Просто запишите ToString(). Это не только даст вам трассировку стека, но и включит внутренние исключения.

7
ответ дан 29 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: