1.错误(bug)
1.1 bug是什么
代码中难免存在错误,不论程序员多么优秀,程序总会出现问题,有些问题,⽐如变量名字写错,导致编译器⽆法编译(语法错误),有的时候我们的逻辑在某些⽅⾯有瑕疵,也会产⽣错误,这类错误成为语义错误(逻辑错误)。
1.2 出现bug如何应对
在程序出错之后,使⽤VS提供给我们的调试功能,找到错误的原因,修改代码。以及学习C#中的错误处理技术,对可能发生错误的地方采取预防措施,并编写弹性代码来处理可能发生的致命错误。
2.错误调试
2.1 正常模式下的调试
- 在VS中我们使用Console. Write(或者WriteLine)⽅法向控制台输出变量的值,通过这个我们可以查看变量的值是否符合我们的预期来调试误。
- 在Unity中我们使用Debug. Log(“”) 、Debug.LogError(“”) 、Debug.LogWarn(“”),向unity的Console窗⼝输出信息,帮助我们调试错误。
例:常通过输出结果来判断程序运行是否符合预期,在不确定的地方后面将变量输出出来以便通过观察变量的变化来判断程序逻辑是否正确。
2.2 中断(Debug)模式下的调试
中断模式指我们在程序运行时暂停程序的执⾏,然后查看程序中的状态,也可以让程序继续执⾏。
2.2.1 如何让程序中断?
需要通过打断点的方式。
2.2.2 断点是什么?
断点事源代码中自动进入中断模式的一个标记,当遇到断点的时候,程序会自动进入中断模式。
3.中断模式下的调试
3.1 添加断点
四种方式:
- 右击代码行,选择breakpoint(断点) -> insert breakpoint(插⼊断点)
- 光标定位到代码行,选择菜单上的Debug(调试)->Toggle Breakpoint(切换断点)
- 光标定位到代码行,按下F9键,在此按下F9是取消断点
- 在需要添加断点的行首位置,直接单击,再次单击取消断点
3.2 窗口
3.2.1 通过窗口添加断点
我们可以通过 (调试-窗口-断点),打开断点窗⼝,这个窗口显示了当前项⽬中添加了的所有的断点,我们可以在这里定位断点的位置,也可以去删除断点
3.2.2 监视变量内容
在中断模式下查看变量值最简单的⽅式,就是把⿏标指向源代码中的变量名,此时会出现⼀个⼯具提示,显⽰该变量的信息。
3.2.3 中断模式下的窗口选项卡
- 错误列表 -程序运行中发⽣的所有错误的列表
- 局部变量 -当前运行环境中所有的局部变量的值
- 监视 -监视某个变量的值的变化
在上面的几个窗口中不但可以观察变量值的变化,还可以直接去修改变量中存储的值
3.2.4 调用堆栈和即时窗口
在中断模式下,右下角课看到调用堆栈和即时窗口
调用堆栈窗口:查看代码当前执行行数与被什么语句调用
即时窗口:可以输入一些命令,查看变量的值,修改变量的值,
可以输入表达式查看结果。
3.3 单步执行
在中断模式下我们可以单步执行代码,单步执行带有有两种 逐过程和逐语句,他们两个都是⼀条语句⼀跳语句的执行,区别在于逐过程遇到函数,**不会进⼊函数内部**,⽽把函数当成⼀条语句去执行。
4.异常处理
4.1 异常是什么
异常是在运行期间代码产生的错误。
例:
int[] myArray = {1,2,3,4};
int myEle = myArray[4];//数组下标越界
运行到这里的时候,会出现异常,这个异常的定义已经在CLR中定义好了。如果我们不去处理这个异常,那么当异常发⽣的时候,程序会终止掉,然后异常后⾯的代码都无法执行。
4.2 如何处理异常
面对有可能出现的异常,常用的解决办法是将其捕获且抛出异常。
4.3 捕获异常(try … catch … finally语句)
4.3.1 句法
try{
可能出现异常的代码块;
}
catch(<exceptionType>e){
发生异常后执行的代码块;
}
finally{
最终执行代码块;
}
其中catch块可以有0或者多个,finally可以有0或者1个,但是如果没有catch块,必须有finally块,没有finally块,必须有catch块,catch块和finally块可以同时存在
4.3.2 例子
// 生产环境 开发环境
int[] myArr = { 1, 2, 3, 4 };
try
{
int temp = myArr[4];
}
catch
{
//出现这个异常的时候,怎么处理
Console.WriteLine("出现了数组下标越界的异常");
}
finally
{
Console.WriteLine("不管是否出现异常,都会执行");
}
Console.Write("23");
4.3.3 代码块用法
- try块包含了可能出现异常的代码(⼀条或者多条语句)。
- catch块用来捕捉异常,当代码发⽣异常,那么异常的类型和catch块中的类型⼀样的时候,就会执行该catch块,如果catch块的参数不写,表示发⽣任何异常都执行这个catch块。
- finally块包含了始终会执行的代码,不管有没有异常产生都会执行。