




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
异常处理和验证控件第一页,共四十一页,编辑于2023年,星期六本章内容错误处理使用验证服务控件第二页,共四十一页,编辑于2023年,星期六5.1错误处理一.异常处理异常:发生不同类型的错误。抛出异常:系统或程序本身向外声明一个异常发生。异常类:错误的种类,都是特定类的对象。错误页面:一个特定的错误页面。处理异常:出现错误时不希望只是出现错误页面,而是能对错误直接处理。处理错误的方法(级别):
1.在类级
2.在页面级
3.在应用程序级第三页,共四十一页,编辑于2023年,星期六二.在类级(程序中)使用try…catch语句块处理异常try{doubledVal1=Convert.ToDouble(txtValue1.Text);doubledVal2=Convert.ToDouble(txtValue2.Text);doubleresult=dVal1/dVal2;labMessage.Text=txtValue1.Text+"/"+txtValue2.Text;labMessage.Text+="="+result;}catch(FormatExceptionex1){labMessage.Text="Pleaseenteravalidnumber";}catch(Exceptionex2){labMessage.Text="Unabletocomputeavaluewiththesevalues";}第四页,共四十一页,编辑于2023年,星期六有时需要使用finally做最后的处理,无论是否发生异常。try{//Openadatabaseconnection//ExecuteSQLstatement}catch(DbExceptionex){//Handledatabaseexception}finally{//Closedatabaseconnectionifitexists}第五页,共四十一页,编辑于2023年,星期六1.异常开销不是多有的问题都需要使用异常来对待,如接受用户数据的输入。下面的处理方法并不是很合适:try{SomeBusinessObject.Login(email);
//Othercodedependentuponasuccessfullogin}catch(Exceptionex){//Displaymessagethatemailwasnotfound}使用下面的处理方法程序将更加健壮:boolokay=SomeBusinessObject.Login(email);if(!okay){//Displayerrormessageonpage}else{//Othercodedependentuponasuccessfullogin}第六页,共四十一页,编辑于2023年,星期六2.可能的异常处理策略当有异常出现时有四种处理策略:通过捕获异常来吞掉它,并且继续正常执行而忽略异常。在catch语句块中完全处理异常。不捕获异常而忽略它(让其他类来处理它)。捕获异常并重新抛出它,以便某个其它的类来处理它。说明:第一种方法根本不合适。属于典型的不负责任。第二种方法最理想,但难以做到,不是什么问题自己都能够解决。第三种方法也比较多见,有时候自己无能力处理,只好交给别人处理。第四种方法也比较多见,根据情况进行处理,并将错误上报。第七页,共四十一页,编辑于2023年,星期六try{//Othercodethatcausesanexception}catch(Exceptionex){//Dosomethingwithexception//Rethrowexceptionthrow;
或thrownewException(myMessage,ex);}第八页,共四十一页,编辑于2023年,星期六三.页面级的异常处理ASP.NET提供了一个Page_Error事件,专门处理页面级异常。看下面的事例。publicpartialclassPageExceptionTest:System.Web.UI.Page{ protectedvoidPage_Load(objectsender,EventArgse){BuggyMethod();}privatevoidBuggyMethod(){//Deliberatelythrowanexceptiontosimulate//uncaughtexceptionthrownewApplicationException("Yourbuggycodecausedanexception.");}
privatevoidPage_Error(objectsender,EventArgse){Exceptionex=Server.GetLastError();Response.Write("<h1>Anerrorhasoccurred</h1>");Response.Write("<h2>"+ex.Message+"</h2>");Response.Write("<pre>"+ex.StackTrace+"</pre>");Context.ClearError();//防止缺省错误页面显示
}}Page_Error中不允许使用控件,所以只能使用Response.Write输出数据。第九页,共四十一页,编辑于2023年,星期六通常不使用Page_Error事件处理器,一般使用Application_Error处理器,它属于应用程序一级,比页面级更有优势。第十页,共四十一页,编辑于2023年,星期六四、应用程序级的异常处理有两种方法:使用Application_Error处理器使用错误页面重定向1.使用Application_Error处理器Application_Error处理器比Page_Error更有优势,它能处理所有页面级的错误。需要说明的是,Application_Error处理器定义在Global.asax文件中(可通过添加全局应用程序类添加)。第十一页,共四十一页,编辑于2023年,星期六下面例子把接收到的任何异常输出到WindowsEventLog,可通过事件查看器浏览。voidApplication_Error(objectsender,EventArgse){ stringmsg="Url"+Request.Path+"Error:"+ Server.GetLastError().ToString(); try{//createtheWebErrorseventsourceifweneedtostringlogName="WebErrors";
if(!EventLog.SourceExists(logName))EventLog.CreateEventSource(logName,logName);//addanewerroreventtothelogEventLoglog=newEventLog();log.Source=logName;log.WriteEntry(msg,EventLogEntryType.Error);}catch(Exceptionex){//notmuchwecandowiththisexceptoutputittodebuggerDebug.WriteLine(ex.Message);}}第十二页,共四十一页,编辑于2023年,星期六也可以把错误形成邮件发送到指定的邮件中或把信息记录到自定义文件中。见教材P180。第十三页,共四十一页,编辑于2023年,星期六2.使用自定义错误页面如果在Page_Error和Application_Error中不使用Context.ClearError方法,则错误会重定向到缺省的错误页面。错误的页面在开发环境和非开发环境下是不同的,开发环境下可以看到错误的详细信息。也可以将错误页面重定向到一个自定义的页面,这需要修改配置文件。<system.web><customErrors
mode="On"defaultRedirect="FriendlyErrorPage.aspx"><error
statusCode="404"redirect="custom404.aspx"/><error
statusCode="500"redirect="custom500.aspx"/></customErrors></system.web>第十四页,共四十一页,编辑于2023年,星期六5.2使用验证服务器控件验证控件用来测试用户的输入并设置输入是否通过测试的属性。验证控件需要引用页面上其他的输入控件。在用户输入时,ASP.NET页框架将用户输入传递到一个或多个适当的验证控件,由验证控件对输入的信息进行验证。ASP.NET提供了五种基本的验证类型控件和一个验证总结控件(ValidationSummary),它们分别由不同的验证控件来实现。第十五页,共四十一页,编辑于2023年,星期六验证控件控件名称说明RequiredFieldValidator确保输入控件的值不为空,即必须输入了数据CompareValidator使用比较运算符(小于、等于、大于等)将用户的输入与另一控件的常数值或属性值进行比较。RangeValidator检查用户的输入是否在指定的上下边界之间。可以检查数字、字母或日期对内的范围。可以将边界表示为常数。RegularExpressionValidator检查输入是否与正则表达式定义的模式匹配。该验证类型允许检查可预知的字符序列,如社会保障号、电子邮件地址、电话号码、邮政编码等中的字符序列。CustomValidator使用您自己编写的验证逻辑检查用户的输入。ValidationSummary以摘要的形式显示页上所有验证程序的验证错误。第十六页,共四十一页,编辑于2023年,星期六下面展示了RequiredFieldValidator控件的使用<asp:TextBoxID="txtUserName"runat="server"/><asp:RequiredFieldValidatorId="reqUser"runat="server"
ControlToValidate="txtUserName"
Text="PleaseenteraUserName"/>其中两个重要属性ControlToValidate用来建立关联,Text显示错误提示。第十七页,共四十一页,编辑于2023年,星期六一、表单验证过程表单数据的验证包括客户端验证和服务器端验证客户端验证:浏览器通过本地JavaScript脚本进行验证,不需要与服务器交互,减少往返时间。效率高。服务器端验证:有些验证必须在服务器端进行,因为需要与服务器上的数据进行比较。两种验证不是绝对分开的。有时因为客户端不支持,客户端验证可能行不通,另外也存在一定的风险(存在脚本漏洞)。所以服务器端验证会更加安全。第十八页,共四十一页,编辑于2023年,星期六1.客户端验证过程客户端验证就是验证的程序是在客户端执行,即控件转换成相关的HTML元素和一些JavaScript程序,例如RequiredFieldValidator控件转换后会有许多JavaScript代码。见实例:ValidationSample.aspx UsingRequired.aspx可通过在浏览器查看源代码,观察生成的JavaScript代码。第十九页,共四十一页,编辑于2023年,星期六2.服务器端验证过程服务器端的验证需要在服务器端编写相关验证程序。有时除了控件本身的验证以外,还需要编写一定的程序进行数据的检查,例如和数据库内容的匹配比较,检查用户名是否已注册等。见第5章实例:DisableClientValidation.aspx注意:Page.IsValid是页面的属性,当为tue时,说明客户端控件合法,即验证控件验证通过。第二十页,共四十一页,编辑于2023年,星期六3.常用验证属性ControlToValidate:控件IDDisplay:错误消息的显示行为。可能的值是:None(不显示验证消息),Static(占用固定的空间并显示错误消息),Dynamic(只有当有错误消息时分配空间并显示消息).缺省值是Static.EnableClientScript:指示客户端验证是否可用.缺省值是true.Enabled:验证控件是否可用ErrorMessage:验证失效,将要显示在ValidationSummary控件中的错误消息文本.ForeColor:验证实效,将要显示错误文本的颜色。缺省为Color.Red.IsValid:验证失效是否传递它的验证检查,一般通过程序检验时设置。SetFocusOnError:验证失败,焦点是否移动到相关控件。缺省为false.Text:验证失败时显示的错误信息.ValidationGroup:指定验证控件所属的验证组的名字.第二十一页,共四十一页,编辑于2023年,星期六二、RequiredFieldValidator控件RequiredFieldValidator控件用于在Web窗体页面上保证用户非空输入,即对必填数据项已输入数据而不会跳过。相关属性:ControlToValidate属性:设置相关联控件。Display属性:设置显示方式,默认为Static,可设置为Dynamic以保证多个相关联验证控件的显示信息都能动态地显示相关信息(即位置不固定)。ErrorMessages属性:显示的提示信息!InitialValue属性:初始值,如果输入控件的值与该值匹配,则验证失败。见实例:UsingRequired.aspx第二十二页,共四十一页,编辑于2023年,星期六三、CompareValidator验证控件
比较两个控件的输入是否符合程序设定。同样该控件也必须设置一个需要验证的控件与之关联。如比较两次输入的口令是否一致。CompareValidator相关属性ControlToValidate:需比较的控件之一。ControlToCompare:比较的控件之二(可省,使用属性ValueToCompare)Operator:定义要执行的比较类型。包括:EqualNotEqualGreaterThanGreaterThanEqualLessThanLessThanEqualDataTypeCheck检查数据类型是否与Type属性指定的类型一致。Type:分为String、Integer、Double、Date和Currency。ErrorMessage:设置当验证失败时出现的错误信息。ValueToCompare:指定控件将要比较的常量见实例:UsingCompare.aspx第二十三页,共四十一页,编辑于2023年,星期六四、RangeValidator验证控件用于计算输入控件的值,以确定该值是否在指定的上限与下限之间。RangeValidator相关属性ControlToValidate属性:指定要验证的输入控件。MinimumValue和MaximumValue属性:分别指定有效范围的最小值和最大值。Type属性:用于指定要比较的值的数据类型。在执行任何比较之前,先将要比较的值转换为该数据类型。类型同前。见实例:UsingRange.aspx第二十四页,共四十一页,编辑于2023年,星期六五、RegularExpressionValidator验证控件用于确定输入控件的值是否与某个正则表达式所定义的模式相匹配。该验证类型允许检查可预知的字符序列,如身份证号、电子邮件地址、电话号码、邮政编码等中的字符序列。RegularExpressionValidator相关属性:属性ValidationExpression指定用于验证输入控件的正则表达式。正则表达式是一种语言,它可以明确描述文本字符串中的模式。通过特定的表达式语法规则验证表达式的合法性。例如:下面是正则表达式的一些示例
http(s)?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?用于验证InternetURL\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*用于验证EMAL[a-zA-Z]{4,8}必须为英文字母,最少四个字符,最多八个字符
\d{6}6位的整型数据
ASP.NET关于正则表达式的说明见P195。在有些网站提供相关资源。见实例:UsingRegExp.aspx第二十五页,共四十一页,编辑于2023年,星期六使用正则表达式1.使用RegEx类有时需要在程序中使用正则表达式,通过程序来对数据进行验证。这就需要使用到RegEx类。RegEx类包含在System.Text.RegularExpressions命名空间。见教材实例:ScrapeHeadings.aspx注意:实例对于中文页面将显示乱码,需要增加第二行的语句:WebClientclient=newWebClient();client.Encoding=Encoding.UTF8;stringcontent=client.DownloadString(txtUrl.Text);第二十六页,共四十一页,编辑于2023年,星期六2.正则表达式和安全SQL注入攻击是常见的一种服务器攻击手段。利用网站合法的SQL语句进行注入,以达到窃取数据的、控制服务器的目的。例如,认证网页中会有型如:
select*fromadminwhereusername='XXX'and password='YYY'
的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。如在用户名文本框内输入: abc’or1=1
在密码框内输入:123则SQL语句变成:
select*fromadminwhereusername='abc’or1=1andpassword='123’
不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。防止注入的有效方法是对用户输入的数据进行验证,确保数据是合法的。第二十七页,共四十一页,编辑于2023年,星期六看下面的示例<asp:TextBoxID="txtName"runat="server"></asp:TextBox><asp:RegularExpressionValidatorID="regName"runat="server"ControlToValidate="txtName"ValidationExpression="^[a-zA-Z'.\s]{1,50}"Text="Enteravalidname"/>
此处对输入的数据做了要求,即匹配任何小写字母大写字母、单引号、逗点、空格,最少1个,最多50个字符。第二十八页,共四十一页,编辑于2023年,星期六也可以在程序中作出检验stringsource=(string)Cookie["someValue"];RegExreg=newRegEx("^[a-zA-Z'.\s]{1,50}");if(!reg.IsMatch(source)){//Sometypeoferrorhandlingwouldgohere}第二十九页,共四十一页,编辑于2023年,星期六六、CustomValidator控件自定义验证逻辑,需要创建一个服务器端验证函数用于执行验证。如验证注册用户名在数据库中是否已经存在。用户可以双击CustomValidator控件,也可以双击该控件的ServerValidate事件来完成自定义验证的代码。看下面的示例:
第三十页,共四十一页,编辑于2023年,星期六下面这段代码是用户用于验证数据库里的学生学号是否存在的函数。protectedvoidCustomValidator1_ServerValidate(objectsource,ServerValidateEventArgsargs){SqlConnectionconn=newSqlConnection("DataSource=LDB;InitialCatalog=Students;UserID=sa");conn.Open();intStuNO=args.Value;SqlCommandcmd=newSqlCommand("selectcount(*)fromstudentwherestuid="+StuNO,conn);intcount=Convert.ToInt32(cmd.ExecuteScalar());
if(count>0){args.IsValid=false;}else{args.IsValid=true;}}第三十一页,共四十一页,编辑于2023年,星期六下面方法检查用户输入的是否是一个有效的未来日期protectedvoidcustDate_ServerValidate(objectsource,ServerValidateEventArgsargs){ stringsEnteredDate=args.Value; DateTimedt; boolconvertSuccessful=DateTime.TryParse(sEnteredDate,outdt); if(convertSuccessful&&dt>=DateTime.Today) args.IsValid=true;//validdateelse args.IsValid=false;//notavaliddate}args对象包含两个属性,Value保存了将要验证控件的字符串,IsValid用来设置输入是否有效。第三十二页,共四十一页,编辑于2023年,星期六下面例子实现了对两个文本框的验证。Enterusername:<br/><asp:TextBoxID="txtUser"runat="server"/><br/>Enteremail:<br/><asp:TextBoxID="txtEmail"runat="server"/><asp:CustomValidatorID="OrFieldValidator"runat="server"Text="Entereitherausernameoraemail"OnServerValidate="OrFieldValidator_ServerValidate"/>上面两个文本框只用了一个验证控件,下面是验证控件的事件处理程序:protectedvoidOrFieldValidator_ServerValidate(objectsource,ServerValidateEventArgsargs){if(txtUser.Text.Length<=0&&txtEmail.Text.Length<=0)args.IsValid=false;elseargs.IsValid=true;}第三十三页,共四十一页,编辑于2023年,星期六自定义客户端验证可通过设置控件的ClientValidationFunction属性使验证在客户端进行。例如<asp:CustomValidatorID="OrFieldValidator"runat="server"Text="Entereitherausernameoraemail"
ClientValidationFunction="validateOrFields"OnServerValidate="OrFieldValidator_ServerValidate"/>此处既有服务器端验证,也增加了客户端验证。客户端验证不需要回传,效率更高。第三十四页,共四十一页,编辑于2023年,星期六使用客户端验证需要定义客户端验证函数,并保证函数的签名如下:
functionname(source,args)例如<scripttype="text/javascript">functionvalidateOrFields(source,args){varsUser=document.form1.<%=txtUser.ClientID%>.value;varsEmail=document.form1.<%=txtEmail.ClientID%>.value;
if(sUser==""&&sEmail==""){args.IsValid=false;}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国仁用杏深加工行业市场调查研究及投资战略咨询报告
- 2024-2025学年高中政治第八课第一框国家财政练习含解析新人教版必修1
- 2023-2028年中国新产品开发废物处置行业市场发展现状及投资战略咨询报告
- 铝箔制品生产项目可行性研究报告立项申请报告模板
- 承包货运合同范本6
- 陶瓷材料项目可行性研究报告
- 文山仓储货架项目资金申请报告
- 中国数字家庭综合服务及全业务套餐市场供需现状及投资战略研究报告
- 导电涂料项目安全评估报告
- 民航机场工程质量管理措施
- 车站信号自动控制(第二版) 课件 -3-6502部分
- 商会2025年工作计划
- 《安全生产法》2024版
- 《消费者心理与行为分析》第五版 课件全套 肖涧松 单元1-10 消费者心理与行为概述 - 消费者购买决策与购后行为
- 《会展概述》课件
- 体检报告电子版
- 2024年中考语文真题分类汇编(全国版)专题12议论文阅读(第01期)含答案及解析
- 七年级下册心理健康教育教学设计
- 食堂清洗及消毒制度
- 服装质量管理制度
- 自然辩证法概论:第四章-马克思主义科学技术社会论
评论
0/150
提交评论