0

我正在通过在 Visual Studio express 中运行它来测试我的 Visual Basic .net 应用程序。

有时它运行正常,但有时我会遇到异常(如果有用,请参阅下面的详细信息)。我不确定为什么会出现异常,因为我正在测试的应用程序的特定部分重用了适用于其他功能的代码。

我应该检查什么,什么会给我关于根本原因的提示。

到目前为止我尝试过的事情是:

  • 重写一些代码以使其更健壮。结果是这种方法失去了控制——我正在纠正一切。我进行了更改,例如替代库(例如用 convertTo 替换 CInt 等)。一些懒惰的声明,但我想到在我更改之前这些代码没有问题。我似乎解决的每一个变化都发现了另一个问题,另一个不同的例外
  • 所以我认为我的安装肯定有根本性的问题,并且搜索发现了来自经历类似情况的人的讨论组帖子。建议的补救措施是重新安装 .net 框架。所以我这样做了,问题仍然存在。

关于解决问题根源的方法有什么想法吗?我不是在寻求解决方案,但非常欢迎一些新的想法。

更新:

我添加了以下代码以获取更多详细信息(+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(Object sender, EventArgs e) 在 C:\labelprint\MyCo 3rd-Party-Industrial-Printing- System v2\MyCo 3rd-Party-Industrial-Printing-System\PrintForms\Customer_EanUpc_serialNumberGeneratorAssembly.vb:System.Windows.Forms.Control.OnClick(EventArgs e) 处 System.Windows.Forms.Button.OnClick(EventArgs e) 处的第 271 行在 System.Windows.Forms.Button.PerformClick() 在 System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) 在 System.Windows.Forms.Control.ProcessDialogKey(Keys keyData) 在 System.Windows.Forms.Control.PreProcessMessage (消息和消息)在 System.Windows.Forms.Control.PreProcessControlMessageInternal(控制目标,消息和msg) 在 System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& 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 reason, ApplicationContext context) 在 System.Windows。 Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.RunDialog(Form form) at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) at System.Windows.Forms.Form .ShowDialog() at 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\实用程序\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我还引入了中间步骤来帮助调试。

现在这里没有发生异常,但我确实在前一周尝试了这个,另一个单独的异常从其他地方弹出(如果我记得的话),所以我们会看看这是否能解决它。关于为什么使用不同的转换实用程序可以解决问题的任何想法?

更新 3: 现在其他地方出现异常:(但是为什么?!这是从库代码中抛出的!)

以下代码导致它:

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

异常消息:“要添加的值超出范围。参数名称:值”

异常目标站点:“System.DateTime Add(Double, Int32)”

异常来源:“mscorlib”

" 在 System.TimeZoneInfo.GetDaylightTime(Int32 年,AdjustmentRule 规则) 在 System.TimeZoneInfo.GetIsDaylightSavingsFromUtc(DateTime time, Int32 年,TimeSpan utc,AdjustmentRule 规则,Boolean& isAmbiguousLocalDst) at System.TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(DateTime time, Boolean& isAmbiguousLocalDst) at System.DateTime.get_Now() at GenerationLibrary.GenerationUtilities.callserialNumberGenerator(String serialNumberGeneratorSnFile, String serialNumberGeneratorRange, DefaultSettingsHandler 设置) C:\labelprint\MyCo 3rd-Party-Industrial-Printing-System v2\GenerationLibrary\GenerationUtilities.vb:GenerationLibrary.MyCoSnGeneration 的第 28 行。C:\labelprint\MyCo 3rd-Party-Industrial-Printing-System v2\GenerationLibrary\MyCoSnGeneration.vb:第 18 行中的constructMyCoSn(DataRow& oDataRow, DefaultSettingsHandler& settings):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:MyCo_3rd-Party-Industrial-Printing-System.Customer_EanUpc_serialNumberGeneratorAssembly 的第 40 行。 btnPrint_Click(Object sender, EventArgs e) 在 C:\labelprint\MyCo 3rd-Party-Industrial-Printing-System v2\MyCo 3rd-Party-Industrial-Printing-System\PrintForms\Customer_EanUpc_serialNumberGeneratorAssembly.vb:System.Windows 的第 275 行。系统中的 Forms.Control.OnClick(EventArgs e)。Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.PerformClick() 在 System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) 在 System.Windows.Forms.Control.ProcessDialogKey(Keys keyData ) 在 System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) 在 System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) 在 System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) 在 System.Windows.Forms.Control.PreProcessMessage(Message& msg) .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 原因,Int32 pvLoopData) 在 System.Windows.Forms.Application。System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 在 System.Windows.Forms.Application.RunDialog(Form form) 在 System.Windows.Forms 的 ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)。 Form.ShowDialog(IWin32Window owner) at System.Windows.Forms.Form.ShowDialog() at MyCo_3rd-Party-Industrial-Printing-System.utlForm.openNewModalForm(String form) in C:\labelprint\MyCo 3rd-Party-Industrial-打印系统 v2\MyCo 3rd-Party-Industrial-Printing-System\Utilities\utlForm.vb:line 128"Form.ShowDialog(IWin32Window owner) at System.Windows.Forms.Form.ShowDialog() at MyCo_3rd-Party-Industrial-Printing-System.utlForm.openNewModalForm(String form) in C:\labelprint\MyCo 3rd-Party-Industrial-打印系统 v2\MyCo 3rd-Party-Industrial-Printing-System\Utilities\utlForm.vb:line 128"Form.ShowDialog(IWin32Window owner) at System.Windows.Forms.Form.ShowDialog() at MyCo_3rd-Party-Industrial-Printing-System.utlForm.openNewModalForm(String form) in C:\labelprint\MyCo 3rd-Party-Industrial-打印系统 v2\MyCo 3rd-Party-Industrial-Printing-System\Utilities\utlForm.vb:line 128"

更新 4

Dim dateNowAsStr As String = CStr(DateTime.Now)

不会导致异常

4

2 回答 2

1

我认为您可以先查看 Customer_EanUpc_serialNumberGeneratorAssembly.vb 源代码文件第 271 行的内容。位于:C:\labelprint\MyCo 3rd-Party-Industrial-Printing-System v2\MyCo 3rd-Party-Industrial-Printing-System\PrintForms\ 目录。

看起来问题与字符串到整数之间的转换有关,可能它失败了,因为字符串无法转换为整数......也许它有字母数字字符......“Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value )"

你已经检查了吗?

为什么您有时会收到错误但并不总是因为(我在这里猜测)serialNumberGeneratorAssembly 中的代码有时会生成仅数字值(可以正确转换为整数),而其他一些时候会生成字母数字序列号(抛出转换例外)。

更新:生成序列号的代码正在生成大于整数值的数字。尝试转换为 Long 而不是 Integer... 或查看 System.Numerics.BigInteger 以防这些数字太大。这解释了:“算术运算导致溢出。” 异常消息。

于 2012-04-12T13:30:20.080 回答
1

在重写或重新安装任何东西之前,您应该尝试确定错误的来源和原因。

首先要做的是分析错误消息和堆栈跟踪。如果您在应用程序的文件中包含调试文件 (.pdb),您将获得更详细的信息,例如行号,这会很有帮助。

如果这不能提供有关错误情况的足够信息,那么您可以向您的应用程序添加一些日志记录。通过记录用户在您的应用中所做的事情,可能有助于重现问题。

最后,您始终可以通过在 google 上搜索或在 StackOverflow 上询问来获得帮助,但请确保包含实际的错误消息,而不仅仅是堆栈跟踪......您还应该发布错误发生的代码。

编辑:

所以实际的错误是:“算术运算导致溢出。”

谷歌搜索会有所帮助:您会发现当您尝试转换超出整数范围的数字时会发生这样的错误。如果您希望有一些非常大的数字,您可以尝试转换为Long

于 2012-04-12T13:32:33.757 回答