Отладчик Visual Studio 2008 не сообщает о некоторых распространенных ошибках - PullRequest
2 голосов
/ 31 октября 2009

В настоящее время я использую VS2008 и VB.NET.

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

В последние несколько дней я сталкивался с этой проблемой несколько раз в разных частях программы.

Что может быть причиной этого?

Вот код:

Structure ConsoleBufferLine
    Public EntryDate As Date
    Public Text As String

    Public Sub New(ByVal textLine As String)
        Text = textLine
        EntryDate = DateTime.Now
    End Sub
End Structure

Код, вызывающий зависание:

Private Buffer As Queue(Of ConsoleBufferLine)
Buffer.Enqueue(New ConsoleBufferLine("-"))

против

Private Buffer As NEW Queue(Of ConsoleBufferLine)
Buffer.Enqueue(New ConsoleBufferLine("-"))

РЕДАКТИРОВАТЬ: Когда я создаю новый проект и набираю следующий код, он также не может вызвать исключение. Тем не менее, когда я пытаюсь это сделать, возникает исключение.

Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim S As New SortedList(Of String, String)
    S.Add("lol", "value")
    S.Add("lol", "value")
  End Sub
End Class

Ответы [ 3 ]

2 голосов
/ 04 ноября 2009

Похоже, что отладчик Visual Basic 2008 не обрабатывает исключения, возникающие во время события «Обрабатывает MyBase.Load».

Например, этот код:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'All code in here that throws exceptions will not throw an exception
    Throw New Exception("FFF")      'This will not be handled by VS debugger.
End Sub

Есть два способа обойти это. Измените «Обрабатывает MyBase.Load» на «Обрабатывает MyBase.Shown». Второй способ - просто запрограммировать его так, чтобы содержимое не инициализировалось в области .load.

1 голос
/ 31 октября 2009

Я не уверен, почему Visual Studio висит на первом примере кода, но определенно есть ошибка в использовании.

Private Buffer As Queue(Of ConsoleBufferLine)
Buffer.Enqueue(New ConsoleBufferLine("-"))

В приведенном выше примере вы объявляете ссылку Queue, но не создаете ее экземпляр. Значение Buffer будет Nothing, поэтому вызов Enqueue приведет к выбрасыванию NullReferenceException. Второй пример работает, потому что дополнительное ключевое слово New приводит к созданию экземпляра очереди.

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

1 голос
/ 31 октября 2009

Без подробностей невозможно ответить на вопрос. Но если бы мне пришлось сделать предположение, я бы заподозрил какой-то бесконечный цикл. Использовали ли вы отладчик для пошагового просмотра кода и просмотра того, что он делает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...