Попробуйте блок Catch не ловить?

У меня есть простая функция, которая пытается получить значение из столбца фильтра сетки Obout, и если значение пустое, игнорирует его и движется дальше. По какой-то причине этот код игнорирует мой блок catch и всегда показывает System.FormatException, когда входная строка пуста!

Еще более странно, если я использую отладчик Visual Studio и устанавливаю точку останова в этой строке, блок catch работает нормально (после того, как я продолжаю с этой строки). Я уже подтвердил, что мой Debug | Исключения | CLR не настроен на отлов при броске. Я также подтвердил такое же поведение в производственной версии.

'Get the month selected
    Dim MonthSelected As Integer
    Try
        MonthSelected = CInt(DateCreatedColumn.FilterCriteria.Value)
    Catch ex As Exception
        'If value is empty / not a number reset the filter
        DateCreatedColumn.FilterCriteria.FilterExpression = String.Empty
        Return
    End Try

person just.another.programmer    schedule 08.08.2011    source источник
comment
Что произойдет, если вы продолжите работу после того, как она достигнет точки останова в отладчике?   -  person 3Dave    schedule 08.08.2011
comment
Попробуйте удалить временные файлы, временные файлы asp.net, папки obj, перестроить и повторить попытку. Даже перезапустить IDE. Похоже, символы отладки, загружаемые по умолчанию, не синхронизированы.   -  person Mrchief    schedule 08.08.2011
comment
Почему у вас есть Return в блоке Catch?   -  person Jodrell    schedule 08.08.2011
comment
вы подтвердили, на какой строке выдается это исключение? Определенно нет возможности, что это исключение вызвано тем, что вы делаете в блоке catch?   -  person Chris    schedule 08.08.2011
comment
@David Lively, программа нормально работает после точки останова   -  person just.another.programmer    schedule 08.08.2011
comment
@Mrchief, я перезапустил, очистил файлы, переиздал и все остальное, без разницы   -  person just.another.programmer    schedule 08.08.2011
comment
@Jodrell, после блока try catch есть еще код, который я не хочу выполнять, если произошла ошибка   -  person just.another.programmer    schedule 08.08.2011
comment
@Chris, я дважды проверил номера строк, они указывают, что это строка MonthSelected = CInt.   -  person just.another.programmer    schedule 08.08.2011
comment
@user794234: Хммм... странно. Тогда я понятия не имею. Я никогда не видел такого поведения. Если вы перейдете в режим отладки, сделаете паузу в этой строке и запустите CInt (например, просто в окне просмотра), выдаст ли это исключение?   -  person Chris    schedule 08.08.2011
comment
@Chris Я пробовал это, он выдает исключение и автоматически перехватывает его в окне отладчика (вместо вывода на страницу ошибки веб-браузера). Непосредственное окно отладчика должно работать в другом пространстве памяти, чем программа, в которой оно расшифровывается.   -  person just.another.programmer    schedule 08.08.2011
comment
это очень странно. Если вы поставите throw new Exception("This is a test"), он поймает это? Просто подумал, что это может, по крайней мере, подтвердить, что он просто не улавливает, а не что-то странное в синтаксическом анализе целых чисел...   -  person Chris    schedule 08.08.2011


Ответы (2)


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

Кроме того, я думаю, вам нужно переписать этот код. Не рекомендуется использовать исключение как часть управления потоком. Исключения требуют значительных вычислительных ресурсов и должны использоваться только в исключительных случаях. Случай, который вы можете спланировать и запрограммировать, по определению не является исключительным. Используйте операторы if для проверки нулей и т. д., не используйте исключения.

person Dave Swersky    schedule 08.08.2011
comment
в частности, в операторе if вы можете использовать int32.TryParse, который вернет логическое значение, определяющее, успешно ли проанализировано ваше целое число (и выходной параметр, чтобы дать вам целое число). - person Chris; 08.08.2011
comment
Это не ноль, это пустая строка. И разве я не должен получить исключение в любом случае (либо NullReference, либо FormatException)? Не знал о цене блока try/catch, я рассмотрю возможность перехода на оператор if/then. Может сделать весь вопрос спорным. - person just.another.programmer; 08.08.2011

В VB для этого есть что-то получше, попробуйте метод IsNumeric().

person MGZero    schedule 08.08.2011