0

Я тестирую приложение Visual Basic .net, запустив его в Visual Studio express.Что я должен учитывать, когда получаю прерывистое исключение в Visual Basic .net (отладка в Visual Studio Express 2010)?

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

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

Вещи, которые я пытался до сих пор являются:

  • Переписывая часть кода, чтобы быть более надежными. Результатом этого было то, что этот подход вышел из-под контроля - я все исправлял. Я внес изменения, такие как альтернативные библиотеки (например, замена CInt на convertTo и т. Д.). Некоторые ленивые объявления, но мне пришло в голову, что с этими изменениями не было проблем с кодом перед моими изменениями. И каждое изменение, которое я, казалось, решал, обнаружил еще одну проблему, другое другое исключение.
  • Так что я думал, что что-то должно быть в корне неверно с моей установкой, и поиск найденных сообщений в группах обсуждения у людей, испытывающих нечто похожее. Предложенным средством было бы переустановить инфраструктуру .net. Поэтому я сделал это, и проблемы все еще возникали.

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

Update:

Я добавил следующий код, чтобы получить более подробную информацию (+1 спасибо @ Meta-Knight)

 Dim exceptionMessage As String = ex.Message 
     Console.WriteLine("Message: \n" & exceptionMessage) 
     Dim exceptionTargetSite As String = ex.TargetSite.ToString 
     Console.WriteLine("Inner: \n" & ex.TargetSite.ToString) 
     Dim exceptionSource As String = ex.Source 
     Console.WriteLine("Source\n:" & exceptionSource) 
     ' put the stack trace into a variable 
     ' (this helps debugging - put a break point after this is assigned 
     ' to see the contents) 
     Dim stackTrace As String = ex.StackTrace.ToString() 
     Console.WriteLine("Stack trace\n:" & stackTrace) 

Более подробную информацию об исключении

Ошибка - сообщение об исключении «Арифметическая операция привела к переполнению».

Исключение Цель сайта: "Int32 ToInteger (System.String)"

Исключение Источник: "Microsoft.VisualBasic"

на Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger (String Value) в MyCo_3rd-Party-Industrial-Printing-System.Customer_EanUpc_serialNumberGeneratorAssembly.btnPrint_Click (отправитель объекта, EventArgs e) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ PrintForms \ Customer_EanUpc_serialNumberGeneratorAssembly.vb: строка 271 в System.Windows.Forms.Cont rol.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.PerformClick() в System.Windows.Forms.Form.ProcessDialogKey (Keys keyData) в системе. Windows.Forms.Control.ProcessDialogKey (Keys keyData) в System.Windows.Forms.Control.PreProcessMessage (Message & msg) в System.Windows.Forms.Control.PreProcessControlMessageInternal (контрольная цель, сообщение & сообщений) в System.Windows.Forms .Application.ThreadContext.PreTranslateMessage (MSG & msg) в System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage (MSG & сообщений) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application .ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.RunDialog (форма формы) в System.Windows.Forms.Form.ShowDialog (владелец IWin32Window) в System.Windows.Forms.Form.ShowDialog () в MyCo_3rd-Party-Industrial-Printing-System.utlForm.openNewModalForm (String form) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ Utilities \ utlForm.vb: строка 128

Обновление 2:

Код вокруг линии 272 был:

 For i As Integer = 1 To CInt(numQuantity) 
      If generationMethods() Then 

Код вокруг линии 272 теперь (я отрегулировать его):

 Dim numQuantityAsStr As String = numQuantity.Text 
     Dim numQuantityAsInt As Integer = Convert.ToInt32(numQuantityAsStr) 
     For i As Integer = 1 To numQuantityAsInt 
      If generationMethods() Then 

numQuantity переменная строка для поля в форма Windows, которую я использую, и это имеет значение, введенное пользователем, поле используется для указания количества чего-то, чтобы эта переменная была преобразована в целое число, чтобы она могла использоваться в цикле for. Значение теста, которое я использую, всегда вводит 1 в этом поле, и иногда это вызывает исключение.

Мое изменение использует то, что я думаю, более современное преобразование типа Convert.ToInt32, а не CInt Я также представил промежуточные шаги, чтобы помочь отлаживать.

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

Update 3: Исключение сейчас происходит в другом месте: (! Но почему ?! Это один выбрасывается из библиотеки кода)

Следующий код вызвал его:

Dim dateNowAsStr As String = DateTime.Now.Date.ToString 

Исключение сообщений : "Значение для добавления за пределами допустимого диапазона. Имя параметра: значение"

Исходный целевой сайт: "System.D. ateTime Add (Double, Int32) "

источник

Исключение: "mscorlib"

" в System.DateTime.Add (двойное значение, Int32 шкала) в System.TimeZoneInfo.TransitionTimeToDateTime (Int32 год, TransitionTime transitionTime) в System.TimeZoneInfo.GetDaylightTime (Int32 год, правила AdjustmentRule) в System.TimeZoneInfo.GetIsDaylightSavingsFromUtc (DateTime время, Int32 год, TimeSpan МСВ, правила AdjustmentRule, Boolean & isAmbiguousLocalDst) в System.TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc (DateTime время, Boolean & isAmbiguousLocalDst) в System.DateTime.get_Now() в GenerationLibrary.GenerationUtilities.callserialNumberGenerator (String serialNumberGeneratorSnFile, String s erialNumberGeneratorRange, DefaultSettingsHandler) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ GenerationLibrary \ GenerationUtilities.vb: строка 28 в GenerationLibrary.MyCoSnGeneration.constructMyCoSn (DataRow & oDataRow, DefaultSettingsHandler &) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ GenerationLibrary \ MyCoSnGeneration.vb: строка 18 в MyCo_3rd-Party-Industrial-Printing-System.Customer_EanUpc_serialNumberGeneratorAssembly.generationMethods() в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ PrintForms \ Customer_EanUpc_serialNumberGeneratorAssembly.vb: строка 40 в MyCo_3rd-Party-Industrial-Printing-System. Customer_EanUpc_serialNumberGeneratorAssembly.btnPrint_Click (отправитель объекта, EventArgs e) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ PrintForms \ Customer_EanUpc_serialNumberGeneratorAssembly.vb: строка 275 в системе. Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.PerformClick() в System.Wi ndows.Forms.Form.ProcessDialogKey (Keys keyData) в System.Windows.Forms.Control.ProcessDialogKey (Keys keyData) в System.Windows.Forms.Control.PreProcessMessage (сообщение & сообщений) в System.Windows.Forms.Control.PreProcessControlMessageInternal (цель управления, сообщение & тзда) в System.Windows.Forms.Application.ThreadContext.PreTranslateMessage (MSG & тзда) в System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage (MSG & msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, Контекст ApplicationContext) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, A pplicationContext) в System.Windows.Forms.Application.RunDialog (форма формы) в System.Windows.Forms.Form.ShowDialog (владелец IWin32Window) в System.Windows.Forms.Form.ShowDialog() в MyCo_3rd-Party-Industrial- Print-System.utlForm.openNewModalForm (String form) в C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ Utilities \ utlForm.vb: строка 128 "

Update 4

НО

Dim dateNowAsStr As String = CStr(DateTime.Now) 

не вызывает исключение

+1

Вы показали трассировку стека, но не фактическую ошибку ... –

+0

+1 @ Meta-Knight спасибо за совет - обновлено сейчас. – therobyouknow

+1

[У вас есть опция Strict On?] (Http://www.getdotnetcode.com/gdncstore/free/Articles/OPTION%20STRICT%20ON.htm) Если нет, вам нужно получить это в своей жизни. –

ответ

1

Я думаю, вы можете начать с рассмотрения того, что находится в строке 271 файла исходного кода Customer_EanUpc_serialNumberGeneratorAssembly.vb. Который расположен: C: \ labelprint \ MyCo 3rd-Party-Industrial-Printing-System v2 \ MyCo 3rd-Party-Industrial-Printing-System \ PrintForms \ каталог.

Похоже, что проблема связана с преобразованием между строкой и целым числом, где, возможно, она не сработала, потому что строка не может быть преобразована в целое ... возможно, она имеет буквенно-цифровые символы ... «Microsoft.VisualBasic.CompilerServices.Conversions .ToInteger (String Value) "

Вы уже проверили это?

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

ОБНОВЛЕНИЕ: код, который генерирует порядковые номера, генерирует числа, превышающие значение Целое. Попробуйте конвертировать в Long вместо Integer ... или посмотрите на System.Numerics.BigInteger в случае, если эти числа слишком велики. Это объясняет: «Арифметическая операция привела к переполнению». сообщение об исключении.

+0

+1 @Carlos Quintanilla благодарит за ваше предложение, я попытался сделать код конверсии более надежным, но после этого произошло другое исключение в другом месте. Таким образом, это заставило меня поверить, что с моей системой произошло что-то более серьезное ... – therobyouknow

+1

Стоит отметить, что vb.net имеет некоторые действительно неприятные правила о числовых типах, некоторые из которых заимствуют из .net, framework, а некоторые из них уникальный для vb.net. Оператор 'IntVar = ByteVar1 + ByteVar2' генерирует исключение, если сумма превышает 255. Это поведение (относительно суммы как' Byte'), вероятно, было добавлено, чтобы избежать необходимости явного приведения типов при выполнении чего-то вроде ByteVar1 = ByteVar2 + ByteVar3' (в C# потребуется суживающий тип от 'int' до' unsigned char'), но это все еще глупо и раздражает. – supercat

+0

+1 точка @supercat стоит знать. Но у меня есть подозрение, что основная причина заключается в том, как используются потоки. Я буду расследовать дальнейшую благодарность за ваш вклад. – therobyouknow

1

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

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

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

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

Edit:

Так фактическая ошибка: "Арифметика операция привела к переполнению."

Googling это помогло бы: вы бы узнали, что такая ошибка возникает, когда вы пытаетесь преобразовать число, которое выходит за пределы для целого числа. Если вы ожидаете получить очень большие цифры, вы можете попробовать конвертировать в Long.

+0

+1 @ Мета-рыцарь для вершины на .pdb и регистрации. – therobyouknow

+1

Не обязательно вне границ для целого числа. В vb.net сумма двух значений 'Byte' также является' Byte'. – supercat

+1

@supercat: В этом случае ошибка возникает, когда строковое значение преобразуется в Integer. В таком случае единственная возможность состоит в том, что число слишком мало или слишком велико, чтобы вписаться в Int32. –

 Смежные вопросы

  • Нет связанных вопросов^_^