Получение информации c из C# сообщений об ошибках WinForms - PullRequest
0 голосов
/ 21 апреля 2020

В моем проекте C# WinForms настроена система ведения журнала, которая записывает в текстовый файл журнала. Типичное сообщение об ошибке выглядит следующим образом:

Error : 
8:34:48 AM Tuesday, April 21, 2020
  :
  :System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.Collections.ArrayList.get_Item(Int32 index)
   at System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
   at CrossReferenceTool.frmXRefTool.DefineControlsLayout() in <PathToSourceCsFile>:line 306

Есть ли способ получить часть этого сообщения об ошибке? В частности, я хотел бы получить метод обидчика (в данном случае DefineControlsLayout()) и номер строки.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Создание новой StackTrace и go запись подробностей после каждого исключения.

Исходная ссылка, которую я использовал: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stacktrace.getframe?view=netframework-4.8

Пример кода using System.Diagnostics;

try
{
    throw new Exception("Fail");
}
catch (Exception e)
{
    StackTrace st = new StackTrace(e);

    // Display the most recent function call.
    StackFrame sf = st.GetFrame(0);
    Console.WriteLine();
    Console.WriteLine("  Exception in method: ");
    Console.WriteLine("      {0}", sf.GetMethod());

    if (st.FrameCount > 1)
    {
        // Display the highest-level function call 
        // in the trace.

        sf = st.GetFrame(st.FrameCount - 1);
        Console.WriteLine("  Original function call at top of call stack):");
        Console.WriteLine("      {0}", sf.GetMethod());

        // will only work if .pdb is included
        var lineNumber = sf.GetFileLineNumber();
        var fileName = sf.GetFileName();


    }
}
1 голос
/ 21 апреля 2020

Если вы уже перехватываете тип исключения, то у вас есть под-свойства, такие как

Exception.StackTrace Exception.TargetSite

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

...