Double ParseDouble - входная строка была не в правильном формате - как исправить? - PullRequest
3 голосов
/ 11 марта 2011

Я продолжаю получать эту же ошибку примерно 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 ]

8 голосов
/ 11 марта 2011

Эта ошибка означает, что какой-то код, подобный этому, выполняется Double.ParseDouble("bacon"). бекон вкусный, но это не двойное. Поместите попытку / поймайте код, чтобы увидеть, что передается в ParseDouble. Это должно помочь определить причину проблемы (вероятно, не бекон), и это должно помочь определить, откуда она исходит. Пользователь вводит его в текстовое поле? Это идет из базы данных? Оттуда вы можете изменить ParseDouble на Double.TryParse . Это позволит вам получить двойное число, если оно равно единице, и, если нет, предоставить альтернативную ветвь кода для выполнения при вводе неверных данных (в этот момент вы можете вернуть ошибку типа «Эй, съешь этот бекон, не помещайте его в там").

1 голос
/ 11 марта 2011

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

Я видел это на нашем веб-сайте maintennace, когда люди вводят знак $ или другую пунктуацию, когдаввод суммы в долларах.Возможно, вам придется отфильтровать такие вещи, но сначала выясните, откуда они.

0 голосов
/ 25 марта 2018

У меня была похожая проблема, когда я вызывал функцию friend из другой формы (без импорта самой формы).По какой-то причине 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
0 голосов
/ 22 июля 2015

Я столкнулся с этой проблемой, работая с каким-то ужасным устаревшим кодом. Я искал высоко и низко для любого незащищенного анализа и не нашел ни одного. Я сделал то, что считал простым изменением:

С

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. После ввода фактического идентификатора в метод, я изменил 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
0 голосов
/ 11 марта 2011

укажите действительный входной параметр, который можно преобразовать в двойной. И используйте Double.TryParse вместо Parse.

0 голосов
/ 11 марта 2011

Я понятия не имею, где именно вы должны искать (это усеченный журнал ошибок?), Но я бы провел аудит для использования Double.Parse и заменил бы их на Double.TryParse .

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

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