Как определить номер строки ошибки

try
{
.........
......Код
.........
}
catch
{ 
    Как получить номер строки кода, на которой произошла ошибка?
}

задан 29 мар 2020 в 12:22

Mart's user avatar

1

В .NET есть класс StackTrace, который позволяет «выдрать» из ошибки все необходимое.
Делается это примерно так:

static void Main(string[] args)
{
    try
    {
        throw new Exception("Некая ошибка");
    }
    catch (Exception e)
    {
        Console.WriteLine($"StackTrace: {e.StackTrace}nn");

        var trace = new StackTrace(e, true);

        foreach (var frame in trace.GetFrames())
        {
            var sb = new StringBuilder();

            sb.AppendLine($"Файл: {frame.GetFileName()}");
            sb.AppendLine($"Строка: {frame.GetFileLineNumber()}");
            sb.AppendLine($"Столбец: {frame.GetFileColumnNumber()}");
            sb.AppendLine($"Метод: {frame.GetMethod()}");

            Console.WriteLine(sb);
        }
    }

    Console.ReadKey();
}

Пояснения:

  • throw new Exception("Некая ошибка"); — Тестовая ошибка.
  • catch (Exception e) — Получаем информацию об ошибке.
  • Console.WriteLine($"StackTrace: {e.StackTrace}nn"); — выводим StackTrace в виде строки (такой нам генерирует Exeption).
  • var sb = new StringBuilder(); — Собираем необходимые данные в билдер.
  • Console.WriteLine(sb); — Выводим.

Вывод:

StackTrace:    в VFS.Program.Main(String[] args) в D:ProjectsOtherTestedAppsVFSProgram.cs:строка 100


Файл: D:ProjectsOtherTestedAppsVFSProgram.cs
Строка: 100
Столбец: 13
Метод: Void Main(System.String[])

Code


Если вы хотите получать такие данные без студии, то не забудьте о наличие .pdb файла!

ответ дан 29 мар 2020 в 14:51

EvgeniyZ's user avatar

EvgeniyZEvgeniyZ

15.2k2 золотых знака27 серебряных знаков51 бронзовый знак

    static void Main()
    {
        try
        {
            int i = 3;
            while (true)
                Console.WriteLine(i / --i); // тут будет деление на 0
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
        }
    }

В .NET Core мне выводит, что ошибка на 13 строке, там находится Console.WriteLine()

at ConsoleApp1.Program.Main() in D:ProjectsC#ConsoleApp1Program.cs:line 13

ответ дан 29 мар 2020 в 12:34

fumanchez's user avatar

5

I want to get line number of code which cause error. For example;

static void Main(string[] args)
{
    using (SqlConnection conn = new SqlConnection(bagcum))
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
        conn.Open();
        int n = cmd.ExecuteNonQuery();
    }
}

so As we know that code doesn’t work, it will throw exception Line number of code which is:

int n = cmd.ExecuteNonQuery();

So how can get that line number of using try-catch? I tried using a StackTrace class but it gives line number as 0:

static void Main(string[] args)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(bagcum))
        {
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
            conn.Open();
            int n = cmd.ExecuteNonQuery();
        }        
    }
    catch (Exception ex)
    {
        System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);            
        Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
    }
}

OUTPUT:

Line:0

Update:
Usually error line of code is 22 so I have to get that number.

Thanks

asked Dec 1, 2011 at 8:39

Mustafa Ekici's user avatar

Mustafa EkiciMustafa Ekici

7,2429 gold badges55 silver badges75 bronze badges

3

Try this simple hack instead:

First Add this (extension) class to your namespace(most be toplevel class):

public static class ExceptionHelper
{
    public static int LineNumber(this Exception e)
    {

        int linenum = 0;
        try
        {
            //linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":line") + 5));

            //For Localized Visual Studio ... In other languages stack trace  doesn't end with ":Line 12"
            linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(' ')));

        }


        catch
        {
            //Stack trace is not available!
        }
        return linenum;
    }
}

And its done!Use LineNumber method whenever you need it:

try
{
//Do your code here
}
catch (Exception e)
{
int linenum = e.LineNumber();
}

Ricardo LR's user avatar

answered Jul 6, 2012 at 13:12

pingsft's user avatar

pingsftpingsft

3163 silver badges4 bronze badges

1

try this

To get the line numbers in the StackTrace, you need to have the correct debug information (PDB files) alongside your dlls/exes. To generate the the debug information, set the option in Project Properties -> Build -> Advanced -> Debug Info:

alt text

Setting it to full should suffice (see the MSDN docs for what the other options do). Debug info (ie. PDB files) are generated for Debug build configurations by default, but can also be generated for Release build configurations.

Generating PDBs for release builds enables you to ship you code without the PDBs, but to drop the PDBs next to the dlls if you need line numbers (or even to attach a remote debugger). One thing to note is that in a release build, the line numbers may not be entirely correct due to optimisations made by the compiler or the JIT compiler (this is especially so if the line numbers show as 0).

answered Dec 1, 2011 at 8:54

Glory Raj's user avatar

Glory RajGlory Raj

17.3k27 gold badges99 silver badges200 bronze badges

0

The problem is that you’re trying to get the line number of the first frame of the exception:

System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());

However, the exception does not originate in the line you write ExecuteNonQuery, but somewhere within that function, possibly multiple stack frames (i.e. nested function calls) deeper. So the first frame (which you explicitly retrieve using GetFrame(0)) is somewhere inside Microsoft’s code (most likely System.Data.dll) for which you don’t have any debugging symbols.

Write out the complete exception stacktrace in your function to see what I mean:

try
{
   // your code ...
}
catch (Exception ex) 
{
   Console.WriteLine(ex);
}

Short of parsing the stacktrace (i.e. ex.StackTrace) there is no reliable why to get the linenumber of the «ExecuteNonQuery()» invocation. I would especially not try to count the stackframes up the stack where your call to ExecuteNonQuery() happens.

I wonder however, what you need the sole linenumber for, why not just log/print/whatever the complete stacktrace instead. At least for diagnostics reasons that is much more useful anyway.

answered Jan 20, 2012 at 9:51

Christian.K's user avatar

Christian.KChristian.K

47.5k10 gold badges99 silver badges143 bronze badges

0

You might get 0 in result if you don’t initialize StackTrace to include fileinfo.

enter image description here

Try this

try
{
    //code
}
catch (Exception e)
{
    var lineNumber = new System.Diagnostics.StackTrace(e, true).GetFrame(0).GetFileLineNumber();
}

This worked for me.

answered Mar 22, 2014 at 20:52

d-coder's user avatar

d-coderd-coder

1,1801 gold badge11 silver badges17 bronze badges

You can use the System.Diagnostics.StackTrace class as below:

public void MethodName()
{
    try
    {
        throw new Exception();
    }
    catch (Exception ex)
    {
        // Get stack trace for the exception with source file information
        var trace = new StackTrace(ex, true);

        // Get the top stack frame
        var frame = trace.GetFrame(0);

        // Get the line number from the stack frame
        var line = frame.GetFileLineNumber();
    }
}

answered Jan 20, 2012 at 10:08

S2S2's user avatar

S2S2S2S2

8,3025 gold badges36 silver badges65 bronze badges

0

Here’s a rather easy way to get a bunch of info from the Exception object: Just add code like this to any potentially exception-throwing methods:

catch (Exception ex)
{
    String exDetail = String.Format(ExceptionFormatString, ex.Message, Environment.NewLine, ex.Source, ex.StackTrace);
    MessageBox.Show(exDetail);
}

The information you get will often be more specific, especially as regards line numbers of where problems are occurring, than you would otherwise see.

You may have noted that the String.Format() uses a constant, namely «ExceptionFormatString». This is a good practice, so that if you want to change it, after adding the above code to 40-eleven methods, you can just change it one place. Anyway, here it is:

public static readonly String ExceptionFormatString = "Exception message: {0}{1}Exception Source: {2}{1}Exception StackTrace: {3}{1}";

Happy Debugging!

answered Nov 15, 2015 at 1:28

B. Clay Shannon-B. Crow Raven's user avatar

0

To get line numbers, you need your application to be in Debug mode or include the debug symbols in the same folder (the .pdb file) for line numbers to appear. You code as posted should then work.

answered Dec 1, 2011 at 8:48

Rowland Shaw's user avatar

Rowland ShawRowland Shaw

37.6k14 gold badges97 silver badges166 bronze badges

the following code exception log handler method is works fine :

in catch :

 catch (Exception ex)
            {
                CommonTools.vAddToLog(ex, EmpID, ErrorCodes.UnDefined);
                Response.Redirect("~/ErrorPage.aspx");
            }

in AddToLog method :

 string _exMsgErr = string.Empty;
                var frame = oStackTrace.FrameCount > 1 ? oStackTrace.GetFrame(1) : oStackTrace.GetFrame(0);
                if (oException.GetType() == typeof(JOVALException))
                {
                    JOVALException _JOVALEx = (JOVALException)oException;
                    _exMsgErr = _JOVALEx.Message;
                }
                else
                {
                    _exMsgErr = oException.Message;
                }
                ErrorLog oError = new ErrorLog(frame.GetMethod().Name, (string)frame.GetFileName(), (int)frame.GetFileLineNumber(), sCustomErrorMessage == string.Empty ? _exMsgErr : sCustomErrorMessage, sUserID, oErrCode);
                //Cont. your code of log file

Finally the xml log file looks like this :

<ErrorLog>
<MethodName>FillRolesDDLs</MethodName>
<FileName>
F:ProjectsERPERPPagesSystemSettingsRoles.aspx.cs
</FileName>
<LineNumber>61</LineNumber>
<ErrorMesssage>
The given DataRow is not in the current DataRowCollection.
</ErrorMesssage>
<UserID>1</UserID>
<ErrCode>UnDefined</ErrCode>
<Time>15/03/2015 16:23:21.976</Time>
</ErrorLog>

answered Mar 15, 2015 at 14:31

Raed Alsaleh's user avatar

Raed AlsalehRaed Alsaleh

1,5519 gold badges27 silver badges50 bronze badges

In .NET 4.5 you can use the ExceptionDispatchInfo to rethrow your exceptions instead of the classic throw;(make sure the PDB files are there or no line numbers will be displayed):

    static void A()
    {
        try
        {
            throw new Exception("A");
        }
        catch (Exception e)
        {
            ExceptionDispatchInfo.Capture(e).Throw();
        }
    }

Source: blogpost.
PDB files don’t decrease performance on Windows.

answered Dec 16, 2016 at 11:08

Petre T's user avatar

Petre TPetre T

4725 silver badges12 bronze badges

Copy the entire stack trace in to a string or stringbuilder by using try/catch that can throw, see the below example

try
{
    //Do some programming
}
catch(Exception ex)
{

   //Catch the exception and assign the stack trace
   StackTrace = ex;
}

The output will be

System.IndexOutOfRangeException: Index was outside the bounds of the array.   
at Program.Run() in C:Console Application1Program.cs:line 37    
at Program.Main(String[] args) in C:Console Application1Program.cs:line 45 

The first line shows the type of the exception and the message. The second line shows the file, function and line number where the exception was thrown

answered Dec 1, 2011 at 8:47

Sai Kalyan Kumar Akshinthala's user avatar

2

Как определить номер строки с ошибкой

Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.

Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика
  • Сайт

Как определить номер строки с ошибкой

Как определить номер строки ( в коде программы ) при выполнении которой возникает ошибка

ЗЫ : киньте плз ссылку на справочник ошибок ( какой номер ошибки что означает )


GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100
  • ICQ

Сообщение GM » 15.05.2005 (Вс) 7:58

Вот небольшой справочник.

Вложения
vber.rar
(5.47 Кб) Скачиваний: 20

الفيجوال بيسك الرابح


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как определить номер строки с ошибкой

Сообщение tyomitch » 15.05.2005 (Вс) 9:17

Rostik Ultra (2) писал(а):Как определить номер строки ( в коде программы ) при выполнении которой возникает ошибка

Erl поможет.

Изображение


Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва
  • ICQ

Re: Как определить номер строки с ошибкой

Сообщение Ennor » 15.05.2005 (Вс) 13:34

tyomitch писал(а):Erl поможет.

Темыч, это точно не опечатка? Что-то ничего не выгугливается…


KDima
Постоялец
Постоялец
Аватара пользователя

 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб
  • ICQ

Сообщение KDima » 15.05.2005 (Вс) 15:41

Ennor

Код: Выделить всё
Private Sub Form_Load()
On Error GoTo Err
1: MsgBox "Line 1"
2: i = 2 0
Exit Sub
Err:
MsgBox "Error on line " + Str$(Erl)
End
End Sub

Тока так. :(

Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)


KDima
Постоялец
Постоялец
Аватара пользователя

 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб
  • ICQ

Сообщение KDima » 15.05.2005 (Вс) 15:47

З.Ы. Erl вернёт последнюю метку

Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)



Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика
  • Сайт

Сообщение Rostik Ultra (2) » 16.05.2005 (Пн) 2:08

KDima писал(а):Ennor

Код: Выделить всё
Private Sub Form_Load()
On Error GoTo Err
1: MsgBox "Line 1"
2: i = 2 0
Exit Sub
Err:
MsgBox "Error on line " + Str$(Erl)
End
End Sub

Тока так. :(

А чё придётся пронумеровывать все строки ? ( можно ли без ентого ? )


Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва
  • ICQ

Сообщение Ennor » 16.05.2005 (Пн) 2:46

2 tyomitch: Понятно :). Эта шняга банально не документирована, поэтому я о ней и не знал. А со старыми версиями я не работал, только в виде VBA и савсэм без MSDN. Н-да, век живи… Спасибо.

2 Rostik Ultra (2): Иначе — никак. Во всяком случае, с требуемой тобой точностью до строки — никак. Сходи по первой ссылке, указанной Темычем — там описан довольно пристойный, имхо, метод использования этой штуки.


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя

 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.05.2005 (Пн) 5:28

Ennor писал(а):Понятно :). Эта шняга банально не документирована, поэтому я о ней и не знал. А со старыми версиями я не работал, только в виде VBA и савсэм без MSDN. Н-да, век живи… Спасибо.

VarPtr тоже не документирована, то ты же о ней знал? ;-)

2All: MZ-Tools иммет функцию нумерации всех строк — полезно непосредственно перед билдом.

Изображение


Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика
  • Сайт

Сообщение Rostik Ultra (2) » 16.05.2005 (Пн) 6:19

ВОПРОС РЕШЁН


Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва
  • ICQ

Сообщение Ennor » 16.05.2005 (Пн) 10:17

tyomitch писал(а):VarPtr тоже не документирована, то ты же о ней знал? ;-)

Ну… я читал Мак-Кинни :). А еще — это форум, еще старый, давно. Кроме того, VarPtr() намного более востребована, чем этот Erl, соответственно, на нее и наткнуться можно быстрее…


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.05.2005 (Пн) 10:29

Ennor, ты на старых бейсиках не писал :)

Когда Ильич был еще маленький и курчавый, а в BASICA требовалось обязательно нумеровать строки, то функция ERL использовалась часто, именно по назначению.

Но когда появился Turbo Basic, а затем QBasic, процесс морального разложения и деградации начался и к появлению VB стал необратимым.

Вот :)

Lasciate ogni speranza, voi ch’entrate.



Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 2

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

static void Main(string[] args)
{
    using (SqlConnection conn = new SqlConnection(bagcum))
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
        conn.Open();
        int n = cmd.ExecuteNonQuery();
    }
}

Так как мы знаем, что код не работает, он будет вызывать исключение. Номер строки кода, который:

int n = cmd.ExecuteNonQuery();

Итак, как можно получить номер строки с помощью try-catch? Я попытался использовать класс StackTrace, но он дает номер строки как 0:

static void Main(string[] args)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(bagcum))
        {
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
            conn.Open();
            int n = cmd.ExecuteNonQuery();
        }        
    }
    catch (Exception ex)
    {
        System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);            
        Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
    }
}

ВЫВОД:

Line:0

Обновление:
Обычно строка ошибки составляет 22, поэтому я должен получить это число.

Спасибо

01 дек. 2011, в 10:05

Поделиться

Источник

10 ответов

Попробуйте этот простой хак:

Сначала добавьте этот класс (расширение) в пространство имен (наиболее подходящим для класса):

public static class ExceptionHelper
{
    public static int LineNumber(this Exception e)
    {

        int linenum = 0;
        try
        {
            //linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(":line") + 5));

            //For Localized Visual Studio ... In other languages stack trace  doesn't end with ":Line 12"
            linenum = Convert.ToInt32(e.StackTrace.Substring(e.StackTrace.LastIndexOf(' ')));

        }


        catch
        {
            //Stack trace is not available!
        }
        return linenum;
    }
}

И его сделать! Используйте метод LineNumber всякий раз, когда вам это нужно:

try
{
//Do your code here
}
catch (Exception e)
{
int linenum = e.LineNumber();
}

pingsft
06 июль 2012, в 14:01

Поделиться

попробуйте это

Чтобы получить номера строк в StackTrace, вам нужно иметь правильную отладочную информацию (файлы PDB) вместе с вашими dll/exes. Чтобы сгенерировать информацию об отладке, установите параметр в Project Properties -> Build -> Advanced -> Debug Info:

Изображение 127205

Установка его в full должна быть достаточной (см. документы MSDN, что и другие варианты). Информация об отладке (то есть файлы PDB) генерируется для конфигураций сборки Debug по умолчанию, но также может быть сгенерирована для конфигураций сборки Release.

Генерирование PDB для релизных сборок позволяет вам отправлять вам код без PDB, но для отказа от PDB рядом с DLL, если вам нужны номера строк (или даже для подключения удаленного отладчика). Следует отметить, что в сборке релизов номера строк могут быть не совсем корректными из-за оптимизаций, сделанных компилятором или компилятором JIT (это особенно важно, если номера строк отображаются как 0).

Enigma State
01 дек. 2011, в 10:51

Поделиться

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

System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());

Однако исключение не возникает в строке, которую вы пишете ExecuteNonQuery, но где-то внутри этой функции, возможно, несколько кадров стека (т.е. вложенных вызовов функций) глубже. Таким образом, первый кадр (который вы явно извлекаете с помощью GetFrame(0)) находится где-то внутри кода Microsoft (скорее всего, System.Data.dll), для которого у вас нет отладочных символов.

Выпишите полное исключение stacktrace в своей функции, чтобы увидеть, что я имею в виду:

try
{
   // your code ...
}
catch (Exception ex) 
{
   Console.WriteLine(ex);
}

Недостаточно синтаксического анализа stacktrace (т.е. ex.StackTrace), нет надежного способа получить имя строки вызова ExecuteNonQuery(). Я бы особенно не попытался подсчитать стековые кадры вверх по стеку, где происходит ваш вызов ExecuteNonQuery().

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

Christian.K
20 янв. 2012, в 11:34

Поделиться

Вы можете использовать класс System.Diagnostics.StackTrace, как показано ниже:

public void MethodName()
{
    try
    {
        throw new Exception();
    }
    catch (Exception ex)
    {
        // Get stack trace for the exception with source file information
        var trace = new StackTrace(ex, true);

        // Get the top stack frame
        var frame = trace.GetFrame(0);

        // Get the line number from the stack frame
        var line = frame.GetFileLineNumber();
    }
}

VS1
20 янв. 2012, в 11:11

Поделиться

Вы можете получить 0 в результате, если вы не инициализируете StackTrace для включения fileinfo.

Изображение 127484

Попробуйте это

try
{
    //code
}
catch (Exception e)
{
    var lineNumber = new System.Diagnostics.StackTrace(e, true).GetFrame(0).GetFileLineNumber();
}

Это сработало для меня.

d-coder
22 март 2014, в 21:04

Поделиться

Здесь довольно простой способ получить кучу информации из объекта Exception: просто добавьте такой код к любым потенциальным методам исключения:

catch (Exception ex)
{
    String exDetail = String.Format(ExceptionFormatString, ex.Message, Environment.NewLine, ex.Source, ex.StackTrace);
    MessageBox.Show(exDetail);
}

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

Возможно, вы заметили, что String.Format() использует константу, а именно «ExceptionFormatString». Это хорошая практика, поэтому, если вы хотите ее изменить, добавив вышеприведенный код в 40-eleven methods, вы можете просто изменить его на одно место. В любом случае, вот он:

public static readonly String ExceptionFormatString = "Exception message: {0}{1}Exception Source: {2}{1}Exception StackTrace: {3}{1}";

Счастливая отладка!

B. Clay Shannon
15 нояб. 2015, в 01:35

Поделиться

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

Rowland Shaw
01 дек. 2011, в 10:37

Поделиться

В .NET 4.5 вы можете использовать ExceptionDispatchInfo, чтобы изменить ваши исключения вместо классического throw; (убедитесь, что PDB файлы есть или номера строк не будут отображаться):

    static void A()
    {
        try
        {
            throw new Exception("A");
        }
        catch (Exception e)
        {
            ExceptionDispatchInfo.Capture(e).Throw();
        }
    }

Источник: blogpost.
Файлы PDB не уменьшают производительность в Windows.

Petre T
16 дек. 2016, в 12:52

Поделиться

следующий метод обработчика журнала ошибок кода отлично работает:

в catch:

 catch (Exception ex)
            {
                CommonTools.vAddToLog(ex, EmpID, ErrorCodes.UnDefined);
                Response.Redirect("~/ErrorPage.aspx");
            }

в методе AddToLog:

 string _exMsgErr = string.Empty;
                var frame = oStackTrace.FrameCount > 1 ? oStackTrace.GetFrame(1) : oStackTrace.GetFrame(0);
                if (oException.GetType() == typeof(JOVALException))
                {
                    JOVALException _JOVALEx = (JOVALException)oException;
                    _exMsgErr = _JOVALEx.Message;
                }
                else
                {
                    _exMsgErr = oException.Message;
                }
                ErrorLog oError = new ErrorLog(frame.GetMethod().Name, (string)frame.GetFileName(), (int)frame.GetFileLineNumber(), sCustomErrorMessage == string.Empty ? _exMsgErr : sCustomErrorMessage, sUserID, oErrCode);
                //Cont. your code of log file

Наконец, файл журнала xml выглядит следующим образом:

<ErrorLog>
<MethodName>FillRolesDDLs</MethodName>
<FileName>
F:ProjectsERPERPPagesSystemSettingsRoles.aspx.cs
</FileName>
<LineNumber>61</LineNumber>
<ErrorMesssage>
The given DataRow is not in the current DataRowCollection.
</ErrorMesssage>
<UserID>1</UserID>
<ErrCode>UnDefined</ErrCode>
<Time>15/03/2015 16:23:21.976</Time>
</ErrorLog>

Raed Alsaleh
15 март 2015, в 14:45

Поделиться

Скопируйте всю трассировку стека в строку или stringbuilder с помощью try/catch, который может быть брошен, см. ниже пример

try
{
    //Do some programming
}
catch(Exception ex)
{

   //Catch the exception and assign the stack trace
   StackTrace = ex;
}

Выход будет

System.IndexOutOfRangeException: Index was outside the bounds of the array.   
at Program.Run() in C:Console Application1Program.cs:line 37    
at Program.Main(String[] args) in C:Console Application1Program.cs:line 45 

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

Sai Kalyan Kumar Akshinthala
01 дек. 2011, в 10:06

Поделиться

Ещё вопросы

  • 0PHP submit обновляет страницу и принимает идентификатор отправки в качестве параметра
  • 0Использование jQuery .empty () для удаления динамических элементов
  • 0Об обработке исключений в C ++
  • 1Могут ли непредсказуемо типизированные аргументы обрабатываться в службе WCF?
  • 1Как получить только пересчитанные ячейки из электронной таблицы Google через API электронных таблиц Google (gdata)
  • 0Путь к изображению не работает в рамках YII?
  • 1Проблема прикрепления zip-файла в javamail
  • 0Angularjs Image Upload показывает пустой вложенный объект
  • 0чекбокс onclick событие jquery не работает
  • 0Как определить причину сбоя с помощью windbg (ntdll! KiFastSystemCallRet)?
  • 0Angularjs не разрешает использовать квадратные скобки в параметре url — ‘[‘
  • 0Формат IP-адреса в HTML
  • 1Highcharts — столбцы гистограммы слишком тонкие, слишком много серий
  • 1Потоковые твиты, в которых упоминается @friendname
  • 0Ошибка на Openshift
  • 0Разница между SELECT COUNT (*) и SELECT true при поиске конкретной строки в таблице миллиардов строк
  • 1unregisterReceiver (получатель) в onPause заставляет получателя не регистрироваться
  • 0AngularJS + ASP.NET MVC: маршрутизация URL без соответствующего физического представления
  • 1Не удается создать NotificationCompat.Builder в Android O
  • 1Заполнение объекта вложенного списка модели на основе выбора флажков в ASP.NET MVC
  • 0Форма размещения статического сайта в другом домене
  • 1Могу ли я отформатировать тип данных TIME на JavaDB?
  • 0Как использовать оператор управления (оператор if) во вложенной директиве ng-repeat?
  • 1displayformatattribute для пользовательского формата строки
  • 0Как нажать на элемент, используя другой связанный элемент?
  • 0Html.toHtml () не конвертирует текст RelativeSizeSpan ‘ed
  • 0Компилятор C ++ имеет противоречивые жалобы на перегрузку оператора <<
  • 0Вызов хранимой процедуры / функции с помощью PHP в сегментированном кластере БД Mongo
  • 0Установка переменной в число на основе результата производной таблицы
  • 0PHP imap — получать сообщения, полученные за последний час
  • 1Как сделать полосовой показ перед графиком
  • 0возмущение сигнала с нормальным шумом в C ++
  • 1заголовок («Content-Type»: «image / jpeg») для интерфейса Swagger.
  • 0Как вставить вывод сложной команды терминала linux в таблицу базы данных mysql
  • 0Передача пользовательских функций в объекты jquery
  • 0запустите / usr / bin / mysqld_safe в фоновом режиме
  • 0MYSQL Сложный оператор выбора запроса
  • 1Использование Ienumerable.TakeWhile, но возвращает только один набор результатов
  • 0ngSwitch не обновляется при изменении модели данных
  • 1Размещение горизонтального рециркулятора в определенной позиции с помощью ConstraintLayout
  • 0Использование MySQL REGEX для сопоставления повторяющихся номеров в телефонных номерах
  • 1Привязка элемента в дочернем представлении к свойству родительского ViewModel
  • 1Получить данные из обратных вызовов
  • 1Добавление атрибутов к сообщениям SOAP в node.js (node-soap)
  • 1Не удается установить заголовки после их отправки. (ошибка nodejs)
  • 1Как получить маршрут REST API, такой как / api / library / 1 / books / 2 / dosomething? Q = params с WebAPI?
  • 1Сложная, но эффективная фильтрация массива JavaScript
  • 0Как получить доступ к информации о потоке в программе
  • 0Загрузка изображений напрямую с сервера
  • 0Время компиляции сгенерированный идентификатор типа константы

Сообщество Overcoder

  • #1

Получение номера строки кода ошибки.

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

AnToXa

AnToXa

prodigy-одаренный ребенок


  • #4

Ну ка, Ну ка
Ща поглядим потом обязательно напишу что нашел а что нет :)

  • #5

Так.
Ну что сказать. Спасибо AnToXa. Да и только.
Ну теперь по делу.
Я скорее всего, до конца может и не понял всего, что там на писанно. Но спрашу как понял. А если что не так подправите.
Как я понял эта SET_ERROR_HANDLER хрень. Перенаправляет функцию вывода найденых сообщений об ошибках.
Ну типа вызывает функцию указанную в
SET_ERROR_HANDLER (Имя моей функции);
с забитыми в вызов уже моей функции аргументами ошибки в PHP скрипте. Вообщем такой сыр бор. Ну так сам вопрос. Я там не нашел ПОЛНОГО описание того, какой синтаксис вызова Моей функции. То есть какие ВСЕ аргументы, SET_ERROR_HANDLER передает вызываемой Моей функции.
Или то что в примере — это и есть полный список.
Конкретно:
$errno, $errstr, $errfile, $errline — Это всё или еще что есть ?
PS
Еще раз сенкс. Просто рулез.
Теперь МОЙ PHP с юморком и ругаться умеет на русском :)))

  • #6

И еще обьясните мне плиз тока, на пальцах.
Что такое конкретно E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE.
Я доку почитал. Но с инглишём ТУГО.
Как я понял по типу ошибки это обычное E_ERROR и т.д. только сообщения эти можно перебивать trigger_error.
То есть если я не буду использовать trigger_error, то мои сообщения E_USER_ERROR и E_ERROR будут одинаковыми.

А если я в начале скрипта поставлю error_reporting ( E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE );
И дальше буду тыкать везде trigger_error то в место обычных ошибок типа E_ERROR, E_WARNING, E_NOTICE бутут вылетать мои. Так что ли ась ?

  • #7

to All
На счет описание синтаксиса, вроде нашел :

$errno — номер типа ошибки
$errmsg — описание ошибки
$filename — фаил в котоом была обнаружена ошибка
$linenum — номер строки с ошибкой
+
$vars — а вот тут я так и не понял что ЭТА ЗА ХРЕНЬ ?

Может кто сталкивался, что это за аргумент, вроде это тип. Только чего? У меня почему то всегда пишет Array. :-?

RomikChef

Guest


  • #8

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

  • #9

to Ромик
Очень смешно ХА*2
На посмейся щас ГАД :)

$errno — 2
$errmsg — OpenDir: Invalid argument (errno 22)
$filename — d:wwwtestPHPr_12.php
$linenum — 118
$vars — Array

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

PS
При чем здесь массив.
Ну как. Давай Ромик блесни. Научи засранца уму разуму. :)

RomikChef

Guest


  • #10

Ну, значит — ошибся…
пора напенсию :-(((((

  • #11

Да не Ромик это я дятел ЛЕНИВЫЙ.
Ты был прав это массив. Вот только Чего? (Ну типа забыл сказать :) )
А вот чего ?
АССОЦИАТИВНО заполненый массив переменных с их значения, той области данных в которой произошла ошибка. Ну типа если ошибка внутри функции, то в массиве будут все переменные со своими значениями этой функции.
PS
Вы бы это видели. ГЫ гы. Если сделать ошибку в майне….. Вся поднаготная системы……
PHP CoooooooooooooL !!!!!!!

AnToXa

AnToXa

prodigy-одаренный ребенок


  • #12

Вы бы это видели. ГЫ гы. Если сделать ошибку в майне….. Вся поднаготная системы……

хм :)
наивный :)

[m]get_defined_vars[/m] :D :D :p

  • #13

ГЫ гы
Сенкс.
Прикольно, почти тоже самое, тока в моём случае кажися удобнее. Ну если ети данные выводить в логи. Ну хотя их можно и при ошибке отсылать. Ну ладно это не важно так просто больше гемора.
Сенкс. Век живи. Век доки читай :) гы гы гы

Понравилась статья? Поделить с друзьями:
  • Как определить ошибку в bios
  • Как определить лексические ошибки в предложении
  • Как определить ошибки файловой системы
  • Как определить коды ошибок на автомобиле
  • Как определить ошибки с помощью бортового компьютера