Looking for c# Keywords? Try Ask4Keywords

C# Language Трассировка стека для простого исключения NullReferenceException в Windows Forms


пример

Давайте создадим небольшой фрагмент кода, который выдает исключение:

private void button1_Click(object sender, EventArgs e)
{
    string msg = null;
    msg.ToCharArray();
}

Если мы выполним это, мы получим следующую трассировку Исключения и стека:

System.NullReferenceException: "Object reference not set to an instance of an object."
   at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in F:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 29
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)

Трассировка стека продолжается так, но эта часть будет достаточной для наших целей.

В верхней части трассировки стека мы видим строку:

в WindowsFormsApplication1.Form1.button1_Click (отправитель объекта, EventArgs e) в F: \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs: строка 29

Это самая важная часть. Он сообщает нам точную строку, в которой произошло исключение: строка 29 в Form1.cs.
Итак, вот где вы начинаете свой поиск.

Вторая строка

в System.Windows.Forms.Control.OnClick (EventArgs e)

Это метод, который называется button1_Click . Итак, теперь мы знаем, что button1_Click , где произошла ошибка, button1_Click из System.Windows.Forms.Control.OnClick .

Мы можем продолжать это; третья строка

в System.Windows.Forms.Button.OnClick (EventArgs e)

Это, в свою очередь, код, который называется System.windows.Forms.Control.OnClick .

Трассировка стека представляет собой список функций, которые вызывались до тех пор, пока ваш код не столкнулся с Exception. И, следуя этому, вы можете выяснить, к какому пути выполнения ваш код следовал, пока он не столкнулся с трудностями!

Обратите внимание, что трассировка стека включает вызовы из системы .Net; вам обычно не нужно следовать всем кодам Microsoft System.Windows.Forms чтобы узнать, что пошло не так, только код, принадлежащий вашему собственному приложению.

Итак, почему это называется «трассировкой стека»?
Поскольку каждый раз, когда программа вызывает метод, он отслеживает, где он был. Он имеет структуру данных, называемую «стек», где он выгружает свое последнее местоположение.
Если выполнение этого метода выполняется, он смотрит на стек, чтобы увидеть, где он был, прежде чем он назвал метод, и продолжит оттуда.

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

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