Double ParseDouble - 输入字符串格式不正确 - 如何修复?

时间:2011-03-11 17:48:18

标签: c# asp.net vb.net string

我每天都会收到大约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,如果它能够照射到主体上。

有没有办法获得更强大的堆栈跟踪?我检查了服务器上的事件查看器,我之前发布的信息就是事件查看器中显示的内容。哪一点都没有用。

感谢您对我的问题的所有回复。

6 个答案:

答案 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