2014-10-23 2 views
0

Я использую этот код для проверки адреса электронной почты, который пользователь вводит в текстовое поле. Код работает, но единственная проблема заключается в том, что пользователь вводит корректный адрес электронной почты, чем удаляет его, я получаю сообщение об ошибке, указывающее, что параметр адреса не может быть нулевым. Ошибка не попадает в ловушку. Зачем?C# Проверка ошибки электронной почты

private bool checkMailLL(string mail) 
    { 
     try 
     { 
      var test = new MailAddress(mail); 
      return true; //valid email 
     } 
     catch (FormatException ex) 
     { 
      return false; //invalid email 
     } 
    } 
+0

Я понимаю, что я могу проверить, сначала ли он пуст. То, что я хочу знать, - это то, почему он дает мне ошибку istead для исключения исключения catch. – Aman

+0

Потому что это не исключение формата. Если почта имеет значение NULL, для корректного формата ничего не нужно проверять. Вы можете изменить «FormatException» на «Exception», а затем go => «MessageBox.Show (ex.ToString());» для проверки вывода и типа исключения. – C4u

+0

@Aman: просто потому, что вы ловите только одно возможное исключение, но не тот, который вызывается, если строка пуста (или null). У вас есть лок в MSDN, где он задокументирован. Я уже добавил ссылку на документацию в [мой ответ] (http://stackoverflow.com/a/26528394/284240). BTW , извините, что я удалил этот комментарий, потому что я отправил ответ, и я упустил из виду, что вы уже прокомментировали его. –

ответ

3

The constructor бросает в том случае, если адрес пуст в ArgumentException, так что вы также должны поймать что:

private bool checkMailLL(string mail) 
{ 
    try 
    { 
     var test = new MailAddress(mail); 
     return true; //valid email 
    } 
    catch (FormatException) 
    { 
     return false; //invalid email 
    } 
    catch (ArgumentException) 
    { 
     return false; //invalid email 
    } 
} 

или немного проще, проверить его сначала вручную, который обрабатывает также можно ArgumentNullException:

private bool checkMailLL(string mail) 
{ 
    if(string.IsNullOrWhiteSpace(mail)) return false; 
    try 
    { 
     var test = new MailAddress(mail); 
     return true; //valid email 
    } 
    catch (FormatException) 
    { 
     return false; //invalid email 
    } 
} 
+0

Спасибо! Это сделало его очень понятным и понятным. – Aman

2

Проверьте mail является нулевым первым:

private bool checkMailLL(string mail) 
{ 
    if (string.IsNullOrEmpty(mail)) 
     return false;  

    try 
    { 
     var test = new MailAddress(mail); 
     return true; //valid email 
    } 
    catch (FormatException ex) 
    { 
     return false; //invalid email 
    } 
} 

MailAddress конструктор не позволит вам пройти в нуль, и он бросает другое исключение, чем FormatException поэтому исключение не перехвачено.

Кроме того, вы можете захотеть взглянуть на это для лучшего способа для проверки сообщений электронной почты: Best Regular Expression for Email Validation in C#

+0

Использование string.IsNullOrEmpty (mail) дает мне ту же ошибку, что и я использовал почту! = "", И она работала – Aman

+0

Я использовал регулярное выражение для проверки своих писем, но мне сказали, что использование регулярного выражения не рекомендуется, поэтому поэтому я изменил к MailAdress (mail). В этом случае было бы лучше использовать регулярное выражение? – Aman

+0

Как правило, считается неправильной практикой использовать блок try/catch для управления потоком программы, поскольку это вычислительно дорого для достижения блока catch. Поэтому, если есть альтернативный способ проверки строки 'mail', которая не включает в себя исключение исключения, в принципе, это лучше. Кроме того, сравнение RegEx, особенно если оно предварительно скомпилировано, происходит очень быстро, скорее всего, быстрее, чем новый объект. Так что да, я бы сказал, что вам лучше использовать Regex. В этой статье MSDN будет объяснено больше: http://msdn.microsoft.com/en-us/library/01escwtf%28v=vs.110%29.aspx –

1
private bool checkMailLL(string mail) 
    { 
     if (String.IsNullOrEmpty(mail)) return false; 
     try 
     { 
      var test = new MailAddress(mail); 
      return true; //valid email 
     } 
     catch (FormatException ex) 
     { 
      return false; //invalid email 
     } 
    } 
Смежные вопросы