《在编写程序的过程中,难免会遇到一些错误为了消除这些.doc》由会员分享,可在线阅读,更多相关《在编写程序的过程中,难免会遇到一些错误为了消除这些.doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第13章 程序调试与错误处理1311程序调试与错误处理( 视频讲解:25分钟)第第 章章导读在编写程序的过程中,难免会遇到一些错误。为了消除这些错误,开发人员需要对应用程序进行调试,查出错误的原因。这些错误可能是非常隐蔽且难以发现的,因此,开发人员需要进行大量故障排查才能发现错误的根源。应用程序开发完成且错误消除之后,必须使用各种数据对它们进行测试,才能确保应用程序能够成功运行。本章主要介绍如何对程序进行调试以及错误处理。13.1 程 序 调 试程序调试是在程序中查找错误的过程,在开发过程中,程序调试是检查代码并验证它能否正常运行的有效方法。另外,在开发时,如果发现程序不能正常工作,就必须找出
2、并解决有关问题。本节将对几种常用的程序调试操作进行讲解。13.1.1 断点断点通知调试器,应用程序在某点上(暂停执行)或某情况发生时中断。发生中断时,称程序和调试器处于中断模式。进入中断模式并不会终止或结束程序的执行,所有元素(如函数、变量和对象)都保留在内存中。执行可以在任何时候继续。插入断点有3种方式:在要设置断点行旁边的灰色空白处单击;右击设置断点的代码行,在弹出的快捷菜单中选择“断点”/“插入断点”命令,如图13.1所示;单击要设置断点的代码行,选择菜单中的“调试”/“切换断点”命令,如图13.2所示。 图13.1 右击插入断点 图13.2 菜单栏插入断点插入断点后,就会在设置断点的行
3、旁边的灰色空白处出现一个红色圆点,并且该行代码也呈高亮显示,如图13.3所示。图13.3 插入断点后效果图图13.4 选择“删除断点”命令删除断点主要有如下3种方式。 可以单击设置了断点的代码行左侧的红色圆点。 在设置了断点的代码行左侧的红色圆点上右击,在弹出的快捷菜单中选择“删除断点”命令。 在设置了断点的代码行上右击,在弹出的快捷菜单中选择“断点”/“删除断点”命令,如图13.4所示。13.1.2 开始执行开始执行是最基本的调试功能之一,从“调试”菜单(见图13.5)中选择“启动调试”命令或在源窗口中右击,可执行代码中的某行,然后从弹出的快捷菜单中选择“运行到光标处”命令,如图13.6所示
4、。 图13.5 “调试”菜单 图13.6 某行代码的右键菜单除了使用上述的方法开始执行外,还可以直接单击工具栏中的按钮,启动调试,如图13.7所示。图13.7 工具栏中的启动调试按钮如果选择“启动调试”命令,则应用程序启动并一直运行到断点。可以在任何时刻中断执行,以检查值、修改变量或检查程序状态,如图13.8所示。图13.8 选择“启动调试”命令运行结果如果选择“运行到光标处”命令,则应用程序启动并一直运行到断点或光标位置,具体要看是断点在前还是光标在前,可以在源窗口中设置光标位置。如果光标在断点的前面,则代码首先运行到光标处,如图13.9所示。图13.9 选择“运行到光标处”命令运行结果13
5、.1.3 中断执行当执行到达一个断点或发生异常,调试器将中断程序的执行。选择“调试”/“全部中断”命令后,调试器将停止所有在调试器下运行的程序的执行。程序并不退出,可以随时恢复执行。此时调试器和应用程序处于中断模式。“调试”菜单如图13.10所示。除了通过选择“调试”/“全部中断”命令中断执行外,也可以单击工具栏中的按钮中断执行,如图13.11所示。 图13.10 “调试”菜单 图13.11 工具栏中的中断执行按钮13.1.4 停止执行停止执行意味着终止正在调试的进程并结束调试会话,可以通过选择菜单中的“调试”/“停止调试”命令来结束运行和调试。也可以单击工具栏中的按钮停止执行。13.1.5
6、单步执行通过单步执行,调试器每次只执行一行代码,单步执行主要是通过“逐语句”、“逐过程”和“跳出”这3种命令实现的。“逐语句”和“逐过程”的主要区别是当某一行包含函数调用时,“逐语句”仅执行调用本身,然后在函数内的第一个代码行处停止。而“逐过程”执行整个函数,然后在函数外的第一行处停止。如果位于函数调用的内部并想返回到调用函数时,应使用“跳出”命令,“跳出”命令将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。当启动调试后,可以单击工具栏中的按钮执行“逐语句”操作、单击按钮执行“逐过程”操作和单击按钮执行“跳出”操作,如图13.12所示。图13.12 单步执行的3种命令除了在工具栏
7、中单击这3个按钮外,还可以通过快捷键执行这3种操作,启动调试后,按下F11键执行“逐语句”操作、F10键执行“逐过程”操作以及Shift+F10键执行“跳出”操作。13.1.6 运行到指定位置如果希望程序运行到指定的位置,可以在指定代码行上右击,在弹出的快捷菜单中选择“运行到光标处”命令,这样当程序运行到光标处时就会自动暂停;另外,也可以在指定的位置插入断点,同样可以使程序运行到插入断点的代码行时自动暂停。13.2 常见服务器故障排除在Visual Studio中测试网站时,ASP.NET Development Server将自动运行,但在一些情况下,使用ASP.NET Developmen
8、t Server会产生错误。本节介绍Web服务器可能产生的错误,并提供相应的解决办法。13.2.1 Web服务器配置不正确运行网站时,显示如下错误:The web server is not configured correctly. See help for common configuration errors. Running the web page outside of the debugger may provide further information. 造成该错误的原因以及常见的解决办法大概包括以下两种。 原因1:网站的执行权限不够解决办法:打开IIS,选择对应网站的属性,在
9、“主目录”选项卡中选择执行权限为“脚本和可执行文件”。 原因2:身份验证方式不正确解决办法:打开IIS,在“网站”节点下选择对应网站,单击鼠标右键,在弹出的快捷菜单中选择“属性”命令,打开网站的属性窗口,选择“目录和安全性”选择卡,单击“匿名访问和身份验证控制”区域中的“编辑”按钮,打开身份验证方法,选中“启用匿名访问”和“集成Windows身份验证”复选框。13.2.2 IIS管理服务没有响应当IIS管理服务没有响应时,会发生“安全检查失败,因为IIS管理服务没有响应”的错误,这通常表示IIS的安装有问题。解决此错误的方法如下:(1)使用“管理工具”中的“服务”工具验证该服务是否正在运行。(
10、2)然后按照以下方法进行操作。 使用“程序和功能”中的“打开或关闭Windows功能”重新安装IIS。 使用“程序和功能”中的“打开或关闭Windows功能”从计算机中删除IIS并重新安装IIS。执行以上两个步骤中的任一步骤后,需要重新启动计算机。13.2.3 未安装ASP.NET当用户尝试调试的计算机上未正确安装ASP.NET时,会发生“未安装ASP.NET”错误,此错误可能意味着从未安装过ASP.NET,或者先安装了ASP.NET,然后又安装了IIS。解决此错误的方法如下:选择“开始”菜单中的“运行”命令,在打开的“运行”窗口输入以下命令安装ASP.NET并注册到IIS。WINNTMicr
11、osoft.NETFrameworkversionaspnet_regiis -i其中,version表示安装在用户计算机上的.NET Framework的版本号。13.2.4 连接被拒绝连接被拒绝时,服务器报告以下错误:10061-Connection RefusedInternet Security and Acceleration Server如果计算机在受Internet Security and Acceleration Server(SA Server)保护的网络上运行,并且满足以下条件之一,就会发生此错误: 客户端未安装防火墙。 Internet Explorer中的Web代理配
12、置不正确。避免此问题的方法如下: 安装防火墙客户端软件,如ISA客户端。 修改Internet Explorer中的Web代理连接设置,以跳过用于本地地址的代理服务器。13.2.5 不能使用静态文件在网站中,静态文件(如图像和样式表)受到ASP.NET授权规则的影响。例如,如果禁用了对静态文件的匿名访问,匿名用户则不能使用网站中的静态文件,但是,将网站部署到运行IIS的服务器时,IIS将提供静态文件而不使用授权规则。13.3 异常处理语句在ASP.NET程序中,可以使用异常处理语句处理异常。常用的异常处理语句有throw、trycatch和trycatchfinally语句,通过这3种异常处理
13、语句,可以对可能产生异常的程序代码进行监控。下面将对这3种异常处理语句进行详细讲解。13.3.1 使用throw语句抛出异常throw语句用于主动引发一个异常,即在特定的情形下自动抛出异常。throw语句的基本格式如下:throw ExObject参数ExObject表示所要抛出的异常对象,这个异常对象是派生自System.Exception类的对象。【例13.1】 使用throw语句抛出异常。(示例位置:TMsl1301)程序实现的主要步骤如下。新建一个网站,默认主页为Default.aspx。在Default.aspx的Page_Load事件中,创建一个int类型的方法MyInt,该方法有
14、两个int类型的参数a和b,其中a为分子,b为分母。如果分母的值是0,则通过throw语句抛出DivideByZeroException异常。代码如下: public int MyInt(int a, int b)/创建一个int类型的方法,参数分别是a和b int num;/声明一个int类型的变量num if (b = 0)/判断b是否等于0,如果等于0,抛出异常 throw new DivideByZeroException();/抛出DivideByZeroException类的异常 return 0; else num = a / b;/计算a除以b的值 return num;/返回
15、计算结果 protected void Page_Load(object sender, EventArgs e) /调用test类中的MyInt方法计算两个数的商 Response.Write(分子除以分母的值: + MyInt(298, 0);运行以上程序,因为要计算的数值的分母为0,所以程序出错,错误信息如图13.13所示。图13.13 分母为0的错误信息13.3.2 使用trycatch语句捕捉异常trycatch语句允许在try后面的大括号中放置可能发生异常情况的程序代码,并对这些程序代码进行监控,而catch后面的大括号中则放置处理错误的程序代码,以处理程序发生的异常。trycat
16、ch语句的基本格式如下:try/被监控的代码catch(异常类名 异常变量名)/异常处理在catch语句中,异常类名必须为System.Exception或从System.Exception派生的类型。当catch语句指定了异常类名和异常变量名后,就相当于声明了一个具有给定名称和类型的异常变量,此异常变量表示当前正在处理的异常。【例13.2】 使用trycatch语句捕捉异常。(示例位置:TMsl1302)程序实现的主要步骤如下。新建一个网站,默认主页为Default.aspx。在Default.aspx的Page_Load事件中声明一个object类型的变量obj,其初始值为null,然后将
17、obj强制转换成int类型赋给int类型变量N,使用trycatch语句捕获异常。代码如下: protected void Page_Load(object sender, EventArgs e) try/使用trycatch语句 object obj = null;/声明一个object变量,初始值为null int N = (int)obj;/将object类型强制转换成int类型 catch (Exception ex)/捕获异常 Response.Write(捕获异常: + ex);/输出异常 实例运行效果如图13.14所示。图13.14 使用trycatch语句捕捉异常(1)上面的
18、实例是直接使用System.Exception类捕获异常,使用其他异常类捕获异常的方法与其类似,这里不再赘述。(2)在trycatch语句中可以包含多个catch语句,但程序只执行第一个catch语句中的信息,其他的catch语句将被忽略。常变量表示当前正在处理的异常。13.3.3 使用trycatchfinally语句捕捉异常将finally语句与trycatch语句结合,可以形成trycatchfinally语句。finally语句同样以区块的方式存在,它被放在所有trycatch语句的最后面,程序执行完毕,最后都会跳到finally语句区块,执行其中的代码。其基本格式如下:try/被监控
19、的代码catch(异常类名 异常变量名)/异常处理finally/程序代码如果程序中有一些在任何情况下都必须执行的代码,则可以将其放在finally语句区块中。【例13.3】 使用trycatchfinally语句捕捉异常。(示例位置:TMsl1303)程序实现的主要步骤如下:新建一个网站,默认主页为Default.aspx。在Default.aspx的Page_Load事件中,声明一个string类型变量str,并初始化为“ASP.NET编程词典”;然后声明一个object变量obj,将str赋给obj;再声明一个int类型的变量i,将obj强制转换成int类型后赋给变量i,这样必然会导致转
20、换错误,抛出异常;最后在finally语句中输出“程序执行完毕”,这样无论程序是否抛出异常,都会执行finally语句中的代码。代码如下: protected void Page_Load(object sender, EventArgs e) string str = ASP.NET编程词典;/声明一个string类型的变量str object obj = str;/声明一个object类型的变量obj try/使用trycatch语句 int i = (int)obj;/将obj强制转换成int类型 catch (Exception ex)/获取异常 Response.Write(ex.Message);/输出异常信息 finally/finally语句 Response.Write(程序执行完毕.);/输出“程序执行完毕” 实例运行效果如图13.15所示。图13.15 使用trycatchfinally语句捕捉异常13.4 实践与练习开发数据库管理系统时,如果不对数据库连接异常进行处理,将会出现很多错误,例如数据库服务器没有开启、用户名或密码错误等,而这些未知的错误将会给用户造成软件不可用这样的误解。这里要求使用异常处理语句捕获程序中的数据库连接异常。247