2016-08-02 6 views
0

Я пытаюсь написать try/catch, и, очевидно, не получается. Я не уверен, что полностью понимаю try/catch, но я знаю, что у меня возникают проблемы, обматывающие то, что мне нужно, чтобы убедиться, что правильная дата вводится через форму. Я хочу сказать, что это должно быть в формате DateTime, а не в строке, и должно быть (MM/dd/yyyy), но эта попытка/проверка вещи бросает меня за цикл.Как использовать try/check для DateTime, чтобы предотвратить ошибку сервера?

Инструкция: Вернитесь к коду проверки, который был добавлен в frmPersonnel коде и добавить TRY/поймать с логикой, чтобы предотвратить недопустимые дату причинения ошибки сервера.

Код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class frmPersonnel : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     btnSubmit.Click += new EventHandler(this.btnSubmit_Click);//event for button 
    } 

    private void btnSubmit_Click(object sender, EventArgs e) 
    { 
//DECLARATIONS 
     int count = 0; 
     string Msg = "You must enter a value in the following fields: <br/> "; 
     Boolean validatedState = true; 
     Boolean validateEntry = false; 
     DateTime endDate = new DateTime(2016, 03, 01); 
     DateTime startDate = new DateTime(2016, 03, 01); 


//BEGIN SERIES OF IF/ELSE FOR CONFIRMING ENTRIES   
     if (Request["txtFirstName"].ToString().Trim() == "") 
      { 
      //displays yellow bg for missing input 
      txtFirstName.BackColor = System.Drawing.Color.Yellow; 
      Msg = Msg + "First Name <br/> "; 
      }//endif 
     else 
     { 
      txtFirstName.BackColor = System.Drawing.Color.White; 
      count += 1; 
     }//end else 

     if (Request["txtLastName"].ToString().Trim() == "") 
     { 
      //displays yellow bg for missing input 
      txtLastName.BackColor = System.Drawing.Color.Yellow; 
      Msg = Msg + "Last Name <br/> "; 
     }//endif 
     else 
     { 
      txtFirstName.BackColor = System.Drawing.Color.White; 
      count += 1; 
     }//end else 

     if (Request["txtPayRate"].ToString().Trim() == "") 
     { 
      //displays yellow bg for missing input 
      txtPayRate.BackColor = System.Drawing.Color.Yellow; 
      Msg = Msg + "Pay Rate <br/> "; 
     }//endif 
     else 
     { 
      txtFirstName.BackColor = System.Drawing.Color.White; 
      count += 1; 
     }//end else 

     if (Request["txtStartDate"].ToString().Trim() == "") 
     { 
      //displays yellow bg for missing input 
      txtStartDate.BackColor = System.Drawing.Color.Yellow; 
      validateEntry = false; 
      Msg = Msg + "Start Date <br/> "; 
     }//endif 
     else 
     { 
      try 
       { 
       //Conversion to DateTime format? 
       startDate = DateTime.Parse(Request["txtStartDate"]); 
       //How do I write the format I want, and when it should be checked? 
       } 
      catch (Exception ex) 
       { 
       //Exception should be caught here, not sure how to write this out though? 
       } 
      validateEntry = true; 
     }//end else 

     if (Request["txtEndDate"].ToString().Trim() == "") 
     { 
      //displays yellow bg for missing input 
      txtEndDate.BackColor = System.Drawing.Color.Yellow; 
      validateEntry = false; 
      Msg = Msg + "End Date <br/> "; 
     }//endif 
     else 
     { 
      try 
      { 
       //Conversion to DateTime format? 
       endDate = DateTime.Parse(Request["txtEndDate"]); 
       //How do I write the format I want, and when it should be checked? 
      } 
      catch (Exception ex) 
      { 
       //Exception should be caught here, not sure how to write this out though? 
      } 
      validateEntry = true; 

     }//end else 
//END SERIES OF IF/ELSE FOR CONFIRMING ENTRIES 

//START IF VALIDATE ENTRY  
     if (validateEntry == true) 
     { 
      if (DateTime.Compare(startDate, endDate) >= 0) 
      { 
       txtStartDate.BackColor = System.Drawing.Color.Yellow; 
       txtEndDate.BackColor = System.Drawing.Color.Yellow; 
       Msg = Msg + "Start Date <br/>" + "End Date <br/> <br/>The end date must be a later date than the start date."; 
       //The Msg text will be displayed in lblError.Text after all the error messages are concatenated 
       validatedState = false; 
       //Boolean value - test each textbox to see if the data entered is valid, if not set validState=false. 
       //If after testing each validation rule, the validatedState value is true, then submit to frmPersonnelVerified.aspx, if not, then display error message 
      } 
      else //goes to this if dates are correct 
      { 
       validatedState = true; 
       count += 2; 
       txtStartDate.BackColor = System.Drawing.Color.White; 
       txtEndDate.BackColor = System.Drawing.Color.White; 
      } 
     } 
//END IF VALIDATE ENTRY 

//SENDS DATA & ERROR MESSAGES 
     if (count == 5 && validatedState == true) 
     { 
      Session["txtFirstName"] = txtFirstName.Text; 
      Session["txtLastName"] = txtLastName.Text; 
      Session["txtPayRate"] = txtPayRate.Text; 
      Session["txtStartDate"] = txtStartDate.Text; 
      Session["txtEndDate"] = txtEndDate.Text; 
      Response.Redirect("frmPersonnelVerified.aspx"); 
      //sends to other page 
     } 
     else 
     { 
      //Writes out error messages 
      Response.Write("<br/><span style = 'color: red ; position: absolute; top: 360px; left: 90px;'>" + Msg + "</span>");   
     } 
//ENDS DATA AND ERROR MESSAGES 


    }//end Function: private void BtnSubmit_click... 

} 
+1

DateTime.TryParseExact? –

+0

Во-первых, 'DateTime.TryParse()' может быть больше того, что вы ищете, оно не генерирует исключение при неудачном анализе. Кроме того, что именно проблема, которую вы видите? У вас есть пустые блоки catch, что означает, что вы на самом деле ничего не делаете в случае исключения и просто игнорируете его полностью. Это то, что вы хотели сделать? Какова конкретная проблема? – David

+0

Это все, что требуется? Я имею в виду, я попробую прямо сейчас, но я ужасно смущен тем, как работает вся попытка/уловка. – Sierra

ответ

1

Из MSDN: https://msdn.microsoft.com/en-us/library/0yd65esw.aspx

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

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

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

Например, предположим, что у вас есть этот код:

string someString = "ABC"; 
DateTime someDate = DateTime.Parse(someString); 

Очевидно "ABC" не является действительным DateTime, так что происходит? Сбой приложения из-за необработанного исключения (ошибка).

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

Если исключение происходит в моей Ьге блоке, а затем прекратить выполнение кода в моей Ьге блоке, выполните код в блоке catch и продолжайте, как будто ничего не произошло. В противном случае просто игнорируйте код в моем блоке catch.

Это называется структурированной обработкой исключений.Вы ожидаете «опасные» области вашего кода и добавляете код непредвиденных обстоятельств в случае возникновения худшего сценария. Обработка структурированных исключений особенно полезна для работы с небезопасными пользовательскими вводами, а также с внешними или ненадежными системами (например, с внешними веб-службами).

Пример:

string someString = "ABC"; 
DateTime someDate; 

try 
{ 
    someDate = DateTime.Parse(someString); 
} 
catch 
{ 
    // someString must not have been a valid DateTime! 
    // Console.WriteLine($"Hey, {someString} is not a valid DateTime!"); 
    Console.WriteLine(String.Format("Hey, {0} is not a valid DateTime!", someString)); 
} 

// Code continues executing because the exception was "caught" 
+0

В вашем ответе следует отметить, что ваш код использует [C# 6 String-интерполяцию] (https://msdn.microsoft.com/en-us/library/dn961160.aspx). Он не скомпилируется, если OP не использует C# 6 –

+0

Не уверен, какая версия, которую я использую, попытается проверить, но я думаю, что это может быть то, что мне нужно. Попытаемся сейчас. – Sierra

+0

И спасибо вам за объяснение, что действительно проясняет мою путаницу. – Sierra

2

Вы можете использовать TryParse для проверки действительной даты

// valid Date 
DateTime goodDate; 
if (DateTime.TryParse("2000-02-02", out goodDate)) 
{ 
    Console.WriteLine(goodDate); 
} 

// not a date 
DateTime badDate; 
if (DateTime.TryParse("???", out badDate)) 
{ 
    Console.WriteLine(badDate); 
} 
else 
{ 
    Console.WriteLine("Invalid"); 
} 

Вы также можете включить культуру, если вы ожидаете формат, основанный на a

string dateString; 
     CultureInfo culture; 
     DateTimeStyles styles; 
     DateTime dateResult;  
// Parse a date and time with no styles. 
     dateString = "03/01/2009 10:00 AM"; 
     culture = CultureInfo.CreateSpecificCulture("en-US"); 
     styles = DateTimeStyles.None; 
     if (DateTime.TryParse(dateString, culture, styles, out dateResult)) 
     Console.WriteLine("{0} converted to {1} {2}.", 
          dateString, dateResult, dateResult.Kind); 
     else 
     Console.WriteLine("Unable to convert {0} to a date and time.", 
          dateString); 
+0

Спасибо за ответ, просто вопрос о регионе ... есть ли библиотека, которая должна быть добавлена ​​в тему для культуры? Как использование культуры ... – Sierra

+0

Культуру можно найти в пространстве имен System.Globalization. Вы можете обновить следующую строку: culture = System.Globalization.CultureInfo.CreateSpecificCulture («en-US»); –

+0

Большое спасибо! – Sierra

1

Если вы действительно хотите, чтобы быть точным:

 DateTime dateValue; 

     var isDatePass = DateTime.TryParseExact("03/08/2002", "MM/dd/yyyy", new CultureInfo("en-US"), DateTimeStyles.None, out dateValue); 

Имейте в виду, вы всегда можете использовать авансовый проверку.

+0

Спасибо, я буду иметь это в виду для будущих ссылок. – Sierra

2

Перемещение validateEntry = true; в пределах try, так что вы не будете устанавливать его, даже если DateTime.Parse бросает исключение. Ваши try-catch s в порядке. Они будут уловить любые ошибки в DateTime.Parse s.

+0

Спасибо, рад, что ты что-то сказал. – Sierra