2010-07-29 3 views
8

Я пишу программу в C#, и я хочу поймать исключения, вызванные преобразованием «» (null) в int. Каково имя исключения?C# - неудачное исключение синтаксического анализа?

EDIT: Я не уверен, что я могу показать здесь полный код ... Но я уверен, что вам не нужен полный код, так:

 int num1 = Int32.Parse(number1.Text); 
     int num2 = Int32.Parse(number2.Text); 
+0

Зачем вам нужно знать название исключения? Вы поймаете его? (Надеюсь, нет ...) –

+9

Также обратите внимание на «», а null - разные вещи. –

+0

Будет ли проблема с ложью вместо обработки исключения? –

ответ

27

Если вы можете этого избежать, не кодируйте по исключениям!

Имя исключений, которое вы ищите, называется FormatException.

Однако было бы разумнее сначала сделать TryParse на объекте, который вы пытаетесь разборки, например.

int value; 
if(!int.TryParse("1", out value)) 
{ 
    // You caught it without throwing an exception. 
} 
+1

Почему бы не «if (! String.IsNullOrEmpty (i))« сначала? Серьезно, вы не хотите даже терпеть TryParse. Даже если вы это сделаете тысячу раз и только один раз проиграете, утверждение if перед TryParse будет быстрее. – DevinB

+5

@devinb: добавьте две дополнительные строки кода, чтобы сделать это быстрее на 10 мс? Звучит как ненужная микро-оптимизация для меня ... – Heinzi

+3

@George, было бы здорово, если бы вы поддержали утверждения вроде «Если вы можете избежать этого, не кодируйте по исключению» и «это было бы разумнее» с некоторыми холодными фактами: -) – Saustrup

13

Вы собираюсь получить FormatException, если синтаксический анализ завершился с ошибкой. Почему бы не использовать int.TryParse вместо этого?

9

В качестве побочного примечания простым способом узнать об исключении является его запуск. Когда вы столкнетесь с ошибкой, он даст вам имя исключения.

0

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

1

В зависимости от того, что вы используете для преобразования. Например, int.Parse будет кидать ArgumentNullException, FormatException, или OverflowException. Шансы это ArgumentNullException вы ищете, но если это пустая строка, а не нулевой ссылки, это, вероятно, будет FormatException

0

Вы, вероятно, хотите получить System.InvalidCastException, хотя я думаю, что будет зависеть от как вы пытаетесь выполнить преобразование.

Было сказано, не было бы проще или проще просто написать код и попробовать сами? В частности, поскольку вы не указали , как вы будете выполнять преобразование.

0

Просто попробуйте. Этот код:

int.Parse(""); 

Выдает исключение форматаException.

0

Исключения стоят дорого. Вы должны использовать int.TryParse. Он вернет логическое значение false, если преобразование завершится с ошибкой.

0

Convert.ToInt32 не генерирует исключение формата («входная строка не в правильном формате») в нулевой строке. Вы можете использовать это, если допустимо, чтобы результат был 0 для пустой строки. (По-прежнему блюет на пустую строку, хотя)

 string s = null; 
     int i = Convert.ToInt32(s); 

Но если вы ожидаете число, чтобы быть в поле, вы должны либо использовать TryParse (как это было предложено) или валидатора какой-то, чтобы сообщить пользователю, что им нужно для ввода номера.

6

Давайте посмотрим at the documentation (который является гораздо более чистое решение, что "пытается его"):

открытые статические INT Анализировать (строка s)

[...]

Исключения:

  • ArgumentNullException: s is null.
  • FormatException: s не в правильном формате.

Это должно ответить на ваш вопрос. Как уже упоминалось, возможно, вы задаете неправильный вопрос и вместо этого хотите использовать Int32.TryParse.

+0

+1 для ссылки на документацию. – Brian

Смежные вопросы