我正试图编写一个try/catch,但显然失败了。我不确定我是否完全理解try/catch,但我知道我很难理解我需要做什么来验证通过表单提交的日期是否正确。我的意思是,我认为它需要是DateTime格式,而不是字符串,应该是(MM/dd/yyyy),但这种try/check的事情让我陷入了循环。
说明:返回您在frmPersonnel代码并添加带有逻辑的try/catch以防止无效导致服务器错误的日期。
代码:
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...
}
来自MSDN:https://msdn.microsoft.com/en-us/library/0yd65esw.aspx
当抛出异常时,公共语言运行库(CLR)会查找处理此异常的catch语句。如果当前执行的方法不包含这样的catch块,CLR会查看调用当前方法的方法,依此类推。如果找不到catch块,则CLR会向用户显示一条未处理的异常消息,并停止执行程序。
try块包含可能导致异常的保护代码。执行块,直到引发异常或成功完成。
你可以从逻辑上想一个尝试。。。接住块有点像一个条件。
例如,假设您有以下代码:
string someString = "ABC";
DateTime someDate = DateTime.Parse(someString);
显然";ABC";不是有效的DateTime,那么会发生什么呢?您的应用程序由于未处理的异常(错误)而崩溃。
当你试着把东西包起来的时候。。。接住块,你基本上是在说:
如果在我的try块中发生异常,则停止执行try块的代码,执行catch块中的代码,然后像什么都没发生一样继续执行。否则,就忽略catch块中的代码。
这被称为结构化异常处理。你期待着";危险的";代码的区域,并在最坏的情况发生时添加应急代码。结构化异常处理对于处理不安全的用户输入以及外部或不可靠的系统(如外部Web服务)特别有用。
一个例子:
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"
您可以使用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");
}
如果您希望使用基于区域的格式,您可能还希望包含区域性
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);
将validateEntry = true;
移动到try
内,这样即使DateTime.Parse
抛出异常,也不会设置它。你的try-catch
很好。它们将捕获DateTime.Parse
s中的任何错误。
如果你真的想准确一点:
DateTime dateValue;
var isDatePass = DateTime.TryParseExact("03/08/2002", "MM/dd/yyyy", new CultureInfo("en-US"), DateTimeStyles.None, out dateValue);
请记住,您可以始终使用预先验证。