我每天都会收到大约3-4次同样的错误,并且没有找到如何解决此问题的运气。根据堆栈跟踪,错误发生在Microsoft.VisualBasic库中,那么我将如何解决此问题呢?
这是我发给自己的报告以及服务器生成的报告。任何建议都将不胜感激。
REQUEST ======= HttpContext.Current.Request.RawUrl: / UserHostAddress: 207.70.41.78 UserHostName: 207.70.41.78 Request.Browser.Type: IE8 Request.Browser.Platform: Win2000 DATA ==== System.Collections.ListDictionaryInternal MESSAGE ======= Input string was not in a correct format. SOURCE ===== Microsoft.VisualBasic TARGET SITE =========== Double ParseDouble(System.String, System.Globalization.NumberFormatInfo) STACK TRACE ============ at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat) at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
我理解错误是什么以及导致错误发生的原因。我遇到的问题是找出这个错误来自代码中的错误。堆栈跟踪告诉我它来自Visual Basic,但没有别的。没有行号,没有关于什么函数导致这个错误发生的其他信息,继续下去所以我在试图诊断某些事情时留下了挠头,这看起来可能被包裹在.dll中。
我们正在运行Ektron 7.6.6 sp2,如果它能够照射到主体上。
有没有办法获得更强大的堆栈跟踪?我检查了服务器上的事件查看器,我之前发布的信息就是事件查看器中显示的内容。哪一点都没有用。
感谢您对我的问题的所有回复。
答案 0 :(得分:8)
此错误表示某些代码正在执行Double.ParseDouble("bacon")
。培根味道鲜美,但它不是双倍的。在代码周围放置一个try / catch,以查看传递给ParseDouble的内容。这应该有助于确定导致问题的原因(可能不是培根),这应该有助于确定它的来源。用户是否在文本框中输入?它来自数据库吗?从那里你可以将ParseDouble更改为Double.TryParse。如果它是一个,这将让你得到双倍,如果没有提供输入坏数据时执行的替代代码分支(此时你可以返回一个错误,如“嘿,吃那个培根,不要把它放入那里”)。
答案 1 :(得分:1)
这里不是很多,但错误消息告诉你出了什么问题 - 你试图将一个字符串解析为一个包含非数字字符的双精度字符串。进一步查看堆栈跟踪以查看调用解析方法的位置,它可能会指向正确的方向。
我在维护网站上看到这个,当人们在输入美元金额时键入$或其他标点符号。你可能需要过滤那种东西,但首先找出它的来源。
答案 2 :(得分:0)
我不知道你应该在哪里查看(这是一个截断的错误日志吗?)但我会审核Double.Parse
的使用并将其替换为Double.TryParse。
转换可能不会成功,但如果您已经输入了垃圾输入,那么它将是一个可管理的失败。
答案 3 :(得分:0)
请提供有效的输入参数,可以转换为double。并使用Double.TryParse
代替Parse
。
答案 4 :(得分:0)
我使用一些可怕的遗留代码遇到了这个问题。我搜索了任何未受保护的解析的高低,没有找到。我做了我认为简单的改变:
这
link.HRef = Globals.BaseURL + Globals.URLRecipe + "?Key=" + Context.Server.UrlEncode(strTemp)
要
link.HRef = Globals.BaseURL & Globals.URLRecipe & "?RecipeId=" & RecipeId
现在,它已经抛出Double Parse错误,加上另一个与strTemp相关的错误是带有配方键的字符串。当遵循第一个URL时,它会有一个Parse错误,因为它试图将Key转换为RecipeId,这是一个int。将实际ID拉入方法后,我更改了URL。
突然间,我收到了这个错误:
System.FormatException: Input string was not in a correct format.
at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
经过多次敲击,我挖掘了我对VB操作员的古老知识,并记住了'+'和'&'之间的一些微妙之处。用于字符串连接。
之前使用的'+'运算符试图将我的闪亮的新Int RecipeId添加到URL的其余部分,编译器试图将其解析为Double。“
将其改为此解决了它:
link.HRef = Globals.BaseURL & Globals.URLRecipe & "?RecipeId=" & RecipeId
答案 5 :(得分:0)
当我从另一个表单调用朋友函数时(我没有导入表单本身),我遇到了类似的问题。由于某种原因,VB编译器没有显示完整的堆栈跟踪日志(或者至少异常消息没有说明查看内部异常)。因此,经过大约2个小时的摆弄后,我发现将异常传递到自定义异常处理程序中,读取内部异常,实际上会显示实际异常,而堆栈跟踪将作为内部异常。这是我的异常代码处理程序代码段(以防万一)。
Public Function ExceptionToString(ByVal Message As String, ByVal ex As Exception) As String
Dim Splitter As String = "-------------------------------------------------------------------"
Dim ex0 As String = Message & vbCrLf & Splitter & vbCrLf
Dim ex1 As String = ""
Dim ex2 As String = ""
Dim ex3 As String = ""
Dim ex4 As String = ""
Dim ex5 As String = ""
Try
ex1 = ex.Message & vbCrLf & Splitter & vbCrLf
Catch exc1 As Exception
End Try
Try
ex2 = ex.StackTrace & vbCrLf & Splitter & vbCrLf
Catch exc1 As Exception
End Try
Try
ex3 = ex.InnerException.Message & vbCrLf & Splitter & vbCrLf
Catch exc1 As Exception
End Try
Try
ex4 = ex.InnerException.StackTrace & vbCrLf & Splitter & vbCrLf
Catch exc1 As Exception
End Try
Try
Dim DataStr As String = ""
For i As Integer = 0 To ex.Data.Keys.Count
Try
DataStr &= ex.Data.Item(ex.Data.Keys(i)) & vbCrLf
Catch exc2 As Exception
End Try
Next
ex5 = DataStr & vbCrLf & Splitter & vbCrLf
Catch exc1 As Exception
End Try
Dim Result As String = ex0 & ex1 & ex2 & ex3 & ex4 & ex5
Return Result
End Function