异常处理和验证控件.ppt_第1页
异常处理和验证控件.ppt_第2页
异常处理和验证控件.ppt_第3页
异常处理和验证控件.ppt_第4页
异常处理和验证控件.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 异常处理和验证控件,郑州信息科技职业学院 张中兴,本章内容,错误处理 使用验证服务控件,5.1 错误处理,一.异常处理 异常:发生不同类型的错误。 抛出异常:系统或程序本身向外声明一个异常发生。 异常类:错误的种类,都是特定类的对象。 错误页面:一个特定的错误页面。 处理异常:出现错误时不希望只是出现错误页面,而是能对错误直接处理。 处理错误的方法(级别): 1.在类级 2.在页面级 3.在应用程序级,二.在类级(程序中)使用trycatch语句块处理异常 try double dVal1 = Convert.ToDouble(txtValue1.Text); double dVal2

2、 = Convert.ToDouble(txtValue2.Text); double result = dVal1 / dVal2; labMessage.Text = txtValue1.Text + / + txtValue2.Text; labMessage.Text += = + result; catch (FormatException ex1) labMessage.Text = Please enter a valid number; catch (Exception ex2) labMessage.Text = Unable to compute a value with

3、these values; ,有时需要使用finally做最后的处理,无论是否发生异常。 try / Open a database connection / Execute SQL statement catch (DbException ex) / Handle database exception finally / Close database connection if it exists ,1.异常开销 不是多有的问题都需要使用异常来对待,如接受用户数据的输入。下面的处理方法并不是很合适: try SomeBusinessObject.Login(email); / Other c

4、ode dependent upon a successful login catch (Exception ex) / Display message that email was not found 使用下面的处理方法程序将更加健壮: bool okay = SomeBusinessObject.Login(email); if (! okay) / Display error message on page else / Other code dependent upon a successful login ,2.可能的异常处理策略 当有异常出现时有四种处理策略: 通过捕获异常来吞掉它

5、,并且继续正常执行而忽略异常。 在catch语句块中完全处理异常。 不捕获异常而忽略它(让其他类来处理它)。 捕获异常并重新抛出它,以便某个其它的类来处理它。 说明: 第一种方法根本不合适。属于典型的不负责任。 第二种方法最理想,但难以做到,不是什么问题自己都能够解决。 第三种方法也比较多见,有时候自己无能力处理,只好交给别人处理。 第四种方法也比较多见,根据情况进行处理,并将错误上报。,try / Other code that causes an exception catch (Exception ex) / Do something with exception / Rethrow e

6、xception throw; 或throw new Exception(myMessage, ex); ,三.页面级的异常处理 ASP.NET提供了一个Page_Error事件,专门处理页面级异常。看下面的事例。 public partial class PageExceptionTest : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) BuggyMethod(); private void BuggyMethod() / Deliberately throw an exception to

7、simulate / uncaught exception throw new ApplicationException( Your buggy code caused an exception.); private void Page_Error(object sender, EventArgs e) Exception ex = Server.GetLastError(); Response.Write(An error has occurred); Response.Write( + ex.Message + ); Response.Write( + ex.StackTrace + );

8、 Context.ClearError(); /防止缺省错误页面显示 Page_Error中不允许使用控件,所以只能使用Response.Write输出数据。,通常不使用Page_Error事件处理器,一般使用Application_Error处理器,它属于应用程序一级,比页面级更有优势。,四、应用程序级的异常处理,有两种方法: 使用Application_Error处理器 使用错误页面重定向 1.使用Application_Error处理器 Application_Error处理器比Page_Error更有优势,它能处理所有页面级的错误。需要说明的是, Application_Error处理

9、器定义在Global.asax文件中(可通过添加全局应用程序类添加)。,下面例子把接收到的任何异常输出到Windows Event Log,可通过事件查看器浏览。 void Application_Error(object sender, EventArgs e) string msg = Url + Request.Path + Error: + Server.GetLastError().ToString(); try / create the WebErrors event source if we need to string logName = WebErrors; if (!Eve

10、ntLog.SourceExists(logName) EventLog.CreateEventSource(logName, logName); / add a new error event to the log EventLog log = new EventLog(); log.Source = logName; log.WriteEntry(msg, EventLogEntryType.Error); catch (Exception ex) / not much we can do with this except output it to debugger Debug.Write

11、Line(ex.Message); ,也可以把错误形成邮件发送到指定的邮件中或把信息记录到自定义文件中。见教材P180。,2.使用自定义错误页面,如果在Page_Error和Application_Error中不使用Context.ClearError方法,则错误会重定向到缺省的错误页面。 错误的页面在开发环境和非开发环境下是不同的,开发环境下可以看到错误的详细信息。 也可以将错误页面重定向到一个自定义的页面,这需要修改配置文件。 ,5.2 使用验证服务器控件,验证控件用来测试用户的输入并设置输入是否通过测试的属性。 验证控件需要引用页面上其他的输入控件。在用户输入时,ASP.NET页框架将用

12、户输入传递到一个或多个适当的验证控件,由验证控件对输入的信息进行验证。 ASP.NET提供了五种基本的验证类型控件和一个验证总结控件(ValidationSummary),它们分别由不同的验证控件来实现。,验证控件,下面展示了RequiredFieldValidator控件的使用 其中两个重要属性ControlToValidate用来建立关联, Text显示错误提示。,一、表单验证过程,表单数据的验证包括客户端验证和服务器端验证 客户端验证:浏览器通过本地JavaScript脚本进行验证,不需要与服务器交互,减少往返时间。效率高。 服务器端验证:有些验证必须在服务器端进行,因为需要与服务器上的

13、数据进行比较。 两种验证不是绝对分开的。有时因为客户端不支持,客户端验证可能行不通,另外也存在一定的风险(存在脚本漏洞)。所以服务器端验证会更加安全。,1.客户端验证过程 客户端验证就是验证的程序是在客户端执行,即控件转换成相关的HTML元素和一些JavaScript程序,例如RequiredFieldValidator控件转换后会有许多JavaScript代码。 见实例:ValidationSample.aspx UsingRequired.aspx 可通过在浏览器查看源代码,观察生成的JavaScript代码。,2.服务器端验证过程 服务器端的验证需要在服务器端编写相关验证程序。有时除了控

14、件本身的验证以外,还需要编写一定的程序进行数据的检查,例如和数据库内容的匹配比较,检查用户名是否已注册等。 见第5章实例:DisableClientValidation.aspx 注意:Page.IsValid是页面的属性,当为tue时,说明客户端控件合法,即验证控件验证通过。,3.常用验证属性,ControlToValidate :控件ID Display :错误消息的显示行为。可能的值是:None (不显示验证消息),Static (占用固定的空间并显示错误消息), Dynamic (只有当有错误消息时分配空间并显示消息). 缺省值是Static. EnableClientScript :

15、指示客户端验证是否可用. 缺省值是true. Enabled :验证控件是否可用 ErrorMessage :验证失效,将要显示在ValidationSummary控件中的错误消息文本. ForeColor: 验证实效,将要显示错误文本的颜色。缺省为Color.Red. IsValid:验证失效是否传递它的验证检查,一般通过程序检验时设置。 SetFocusOnError:验证失败,焦点是否移动到相关控件。缺省为false. Text :验证失败时显示的错误信息. ValidationGroup:指定验证控件所属的验证组的名字.,二、RequiredFieldValidator控件,Requi

16、redFieldValidator控件用于在Web窗体页面上保证用户非空输入,即对必填数据项已输入数据而不会跳过。 相关属性: ControlToValidate属性:设置相关联控件。 Display属性:设置显示方式,默认为Static,可设置为Dynamic以保证多个相关联验证控件的显示信息都能动态地显示相关信息(即位置不固定)。 ErrorMessages属性:显示的提示信息! InitialValue属性:初始值,如果输入控件的值与该值匹配,则验证失败。 见实例:UsingRequired.aspx,三、CompareValidator验证控件,比较两个控件的输入是否符合程序设定。同样

17、该控件也必须设置一个需要验证的控件与之关联。如比较两次输入的口令是否一致。 CompareValidator 相关属性 ControlToValidate:需比较的控件之一。 ControlToCompare:比较的控件之二(可省,使用属性ValueToCompare) Operator:定义要执行的比较类型。包括: Equal Not Equal GreaterThan GreaterThanEqual LessThan LessThanEqual DataTypeCheck 检查数据类型是否与Type属性指定的类型一致。 Type:分为String、Integer、Double、Date和

18、Currency。 ErrorMessage:设置当验证失败时出现的错误信息。 ValueToCompare:指定控件将要比较的常量 见实例:UsingCompare.aspx,四、RangeValidator验证控件,用于计算输入控件的值,以确定该值是否在指定的上限与下限之间。 RangeValidator相关属性 ControlToValidate 属性:指定要验证的输入控件。 MinimumValue 和 MaximumValue 属性:分别指定有效范围的最小值和最大值。 Type 属性:用于指定要比较的值的数据类型。在执行任何比较之前,先将要比较的值转换为该数据类型。类型同前。 见实例

19、:UsingRange.aspx,五、RegularExpressionValidator验证控件,用于确定输入控件的值是否与某个正则表达式所定义的模式相匹配。该验证类型允许检查可预知的字符序列,如身份证号、电子邮件地址、电话号码、邮政编码等中的字符序列。 RegularExpressionValidator相关属性: 属性ValidationExpression指定用于验证输入控件的正则表达式。 正则表达式是一种语言,它可以明确描述文本字符串中的模式。通过特定的表达式语法规则验证表达式的合法性。 例如:下面是正则表达式的一些示例 http(s)?:/(w-+.)+w-+(/w- ./?% c

20、lient.Encoding = Encoding.UTF8; string content = client.DownloadString(txtUrl.Text);,2.正则表达式和安全 SQL注入攻击是常见的一种服务器攻击手段。利用网站合法的SQL语句进行注入,以达到窃取数据的、控制服务器的目的。例如,认证网页中会有型如: select * from admin where username=XXX and password=YYY 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。如在用户名文本框内输入: abc or 1=1 在密码框内输入:123 则SQ

21、L语句变成:select * from admin where username=abc or 1=1 and password=123 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。 防止注入的有效方法是对用户输入的数据进行验证,确保数据是合法的。,看下面的示例 此处对输入的数据做了要求,即匹配任何小写字母大写字母、单引号、逗点、空格,最少1个,最多50个字符。,也可以在程序中作出检验 string source = (string)CookiesomeValue; RegEx reg = new RegEx(a-zA-Z.s1,50); if ( !

22、 reg.IsMatch(source) ) / Some type of error handling would go here ,六、CustomValidator控件,自定义验证逻辑,需要创建一个服务器端验证函数用于执行验证。如验证注册用户名在数据库中是否已经存在。 用户可以双击CustomValidator控件,也可以双击该控件的ServerValidate事件来完成自定义验证的代码。看下面的示例:,下面这段代码是用户用于验证数据库里的学生学号是否存在的函数。 protected void CustomValidator1_ServerValidate(object source,

23、ServerValidateEventArgs args) SqlConnection conn = new SqlConnection(Data Source = LDB;Initial Catalog=Students;User ID=sa); conn.Open(); int StuNO = args.Value; SqlCommand cmd = new SqlCommand(select count(*) from student where stuid= + StuNO, conn); int count = Convert.ToInt32(cmd.ExecuteScalar();

24、 if (count 0) args.IsValid = false; else args.IsValid = true; ,下面方法检查用户输入的是否是一个有效的未来日期 protected void custDate_ServerValidate(object source, ServerValidateEventArgs args) string sEnteredDate = args.Value; DateTime dt; bool convertSuccessful = DateTime.TryParse(sEnteredDate, out dt); if (convertSucce

25、ssful / not a valid date args对象包含两个属性,Value保存了将要验证控件的字符串,IsValid用来设置输入是否有效。,下面例子实现了对两个文本框的验证。 Enter user name: Enter email: 上面两个文本框只用了一个验证控件,下面是验证控件的事件处理程序: protected void OrFieldValidator_ServerValidate(object source, ServerValidateEventArgs args) if (txtUser.Text.Length = 0 ,自定义客户端验证,可通过设置控件的ClientValidationFunction属性使验证在客户端进行。例如 此处既有服务器端验证,也增加了客户端验证。客户端验证不需要回传,效率更高。,使用客户端验证需要定义客户端验证函数,并保证函数的签名如下: function name(source,args) 例如 function validateOrFields(source, args) var sUser = document.form1.value; var sEmail = document.form

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论