程序调试
找出程序出现的错误或者异常并将其改正的过程称之为程序调试
程序调试的具体操作太琐碎,只有多多自行测试体会,下面只是说个大概的使用方法
调试的作用:通过查看程序执行步骤弄懂其执行原理,查找/修改程序中的表达式是否按照设想执行,修改变量的值,查找出现bug的原因等
1设置断点
1.1设置断点最简单方式是在行号左侧的灰色地方单击,出现一个红色圆点即可
1.2调试菜单中的命令选项或者快捷键
无法在注释语句或类似else语句这样的行 设置断点
设置断点
2首先启动调试:1)菜单:调试一>启动调试命令 2)快捷键F5 3)右击鼠标选择运行到光标处(如果光标所在行之前有断点就会在断点处暂停)
3查看/调整执行流程
3.1可以按快捷键F10或F11 3.2单击工具栏的按钮 3.3调试菜单中逐语句/过程命令
查看执行流程
通过逐语句可以查看程序执行的每一个步骤;如果对之前说过的分支,循环及其嵌套等执行步骤看不明白的,可以通过此方式查看程序执行流程
调整执行流程(规范:谨慎使用;现阶段无所谓)
调整执行流程
按的太快了,执行过了,重新启动调试太麻烦,可以用鼠标拖动黄色箭头到指定代码行,让执行过的程序重新执行一次
3查看/修改变量值
查看变量
鼠标移动到变量或表达式上面自动显现变量或表达式当前的值
在下面的局部变量,监视,即时窗口等小窗口可以查看或修改变量或表达式及其值(自行调试修改体会);右侧显示程序执行步骤,可以单击某一步查看当前步骤中程序的各种信息
try-catch结构
在VS中执行代码的错误与异常是两个概念
错误:在编写或编译时就会显现,不会编译出程序集(.exe文件)主要是语法错误
异常:语法无错误,只有在运行时才会发生,会阻塞程序继续执行;主要是规则错误
错误与异常语句
编译无错误,只有运行时执行到此代码才发现不符合其转换规则因此抛异常,程序暂停,不再执行后面的输出等语句;有时程序会因为某些不明原因抛异常导致整个程序崩溃
现阶段最常遇到的异常情况为:1)如上面转换类型2)两数相除或取余,除数为0时
有缺陷的解决方案:使用if-else结构
示例1:编程实现打印输出两个操作数相除的结果
使用if结构保证程序正常执行
使用if-else结构可以解决一些简单的异常,但是有些异常无法使用此结构解决
如文件的读取写入操作,会因为没有权限,文件打开正在使用等等读取/写入文件时抛异常,此类的异常无法使用上述结构解决
根本原因是我们无法通过程序得知是否有操作权限,关闭打开的文件等操作,但是.Net机制它可以获取相关信息,因此才会有try-catch异常处理机制
try-catch结构的语法格式
//最简单的使用方式,复杂的之后再说
try //意思是 试一试看能不能捕获异常
{
//有可能出现异常的代码
//尽可能不要有不会抛异常的代码(个人定义 “无效”代码)
//会因为过多的”无效”代码 消耗性能
}
catch //意思是 抓 如果捕获了异常怎么处理
{
//最简单处理,给出错误信息
}
//无论是否抛异常不会影响程序运行
//即使有异常处理机制也不可能保证整个程序100%
其作用:用于捕获异常,不会因异常代码让程序崩溃停止,可以无碍执行后面的代码
执行原理:
如果try语句块中有一句代码抛异常,不再执行异常后面的代码,立即跳到catch语句块中,执行里面的代码,然后执行try-catch结构后面的代码
如果try里面没有一句代码抛异常,执行完try里面的代码,不会执行catch里面的代码,直接跳到catch语句块后面,执行器后面的代码
蓝色无异常;红色有异常; 可以使用调试查看其执行过程
while (true) //尽量不要在循环中使用
{
//方式1 假设转换一定成功(本程序使用的方式)
//方式2 将转换代码也放在try语句块中(自己修改测试)
int n1, n2, num = 0;
Console.WriteLine(“请输入n1的操作数”);
n1 = int.Parse(Console.ReadLine());
Console.WriteLine(“请输入n2的操作数”);
n2 = int.Parse(Console.ReadLine());
try
{
Console.WriteLine(“AAA”);
num = n1 / n2;
Console.WriteLine(“BBB”);
}
catch
{
Console.WriteLine(“有异常语句了”);
}
//无论try里面是否有异常代码不影响输出等语句的执行
Console.WriteLine(“n1/n2={0}”, num);
Console.WriteLine(“”);
}
示例2:只要用户输入的不是数字,就让用户一直输入
验证输入是否可以转换为数字
bool flag = true;
int num = 0;
do
{
try
{
Console.WriteLine(“请输入数字”);
num = Convert.ToInt32(Console.ReadLine());
flag = false;
}
catch
{
flag = true;
}
} while (flag);
Console.WriteLine(“输入的数字是{0}”,num);
Console.ReadKey();
之前有关算术运算的示例中肯定存在这样的bug,既然有了可以验证输入结果是否为数字的方法,以后只要需要使用数字进行算术运算的地方都会使用此方法,将非法数据排除