调试与异常处理

程序调试技术

使用VS错误报告

两种bug:语法错误,逻辑错误

语法错误

违反了C#语言的语法规定,如:string str = 'Hello';(应为双引号)
例:试图在类外访问其私有成员、使用未赋值的变量等

寻找逻辑错误

跟踪代码:把VS配置为中断模式,把程序的输出选项选为Debug(把启动调试按钮后的下拉列表框内容调整为Debug)

单步执行程序

F11键或选择菜单命令“调试——逐语句”。
开始单步执行后代码首先停留在Main函数的第一行,按F10或F11向下执行。单步执行时可以选择是否路过一行代码中所调用的方法,是按F10,想进入过程进行更为细致的观察按F11。
VS监视窗口可以显示当前执行位置的变量值的情况,监视某个变量的值。
自动窗口:显示当前过程中的当前执行的所有变量。
局部变量窗口:显示当前运行位置附近的局部变量值。

设置断点

在可能出现问题的开始处设置断点,使程序能够在某一行停下来。

使用方法

首先把光标放在想要程序暂停的地方,按F9或单击那一行前边界,或“调试——新断点”
选择“调试——窗口”,打开局部变量窗口可以看到当前方法中的局部变量的值。打开即时窗口,在这个窗口中用户可以输入命令、查看变量,或计算表达式的值。

设置断点位置的策略

1、从大到小逐步缩小范围
2、注释掉可能出错的行

异常类与异常处理

异常类

C#程序设计实用教程(第二版)清华出版社 P182

异常处理

使用try、catch、finally关键字定义异常代码块
例:

public void test_notry()
        {
            int[] arr = { 0, 1, 2 };
            for (int i = 0; i <= 3; i++)		//i==3时越界
            {
                Console.WriteLine(arr[i]);
            }
        }

报错:在这里插入图片描述
使用try—catch—finally妥善解决问题。
将有可能出现异常的代码放在try语句块中,将处理try语句块中出现异常的代码放在catch语句块中,finally语句是不管try语句中有没有异常发生,最后到要执行其中的程序块。
三种形式:
try—catch
try—catch—finally
try—finally

 public void test_withtry()
        {
            int[] arr = { 0, 1, 2 };
            try
            {
                for (int i = 0; i <= 3; i++)
                {
                    Console.WriteLine(arr[i]);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine("Exit test_withtry");
            }
        }

catch块中包含的是出现异常时要执行的代码,在一个try后可以有0个以上的catch块。try中没有异常则不会执行catch,catch后面的括号中放入希望捕获的异常。当两个catch语句的异常类有派生关系时,要将包括派生的异常类catch语句放在前面,基类放在后面。
finally块包含了一定要执行的代码,通常是一些资源释放、关闭文件等代码。

例:含多个catch语句的示例

namespace MultiCatch
{
    class Program
    {
        static void Main(string[] args)
        {
            test_withtry_mulcatch();
        }
        public static void test_withtry_mulcatch()
        {
            int[] arr = { 0, 1, 2 };
            try
            {
                for (int i = 0; i <= 3; i++)
                {
                    Console.WriteLine(arr[i]);
                }
            }
            catch (IndexOutOfRangeException e)
            {
                Console.WriteLine(e.Message);
            }
            catch (Exception e)				//Exception是所有异常的基类
            {
                Console.WriteLine(e.Message);
            }
            finally 
            {
                Console.WriteLine("Exit test_withtry_mulcatch");
            }
        }
    }
}

高质量编码标准

编码结构

好的缩进结构展现良好的代码层次结构

注释风格

尽量使用“///”注释,VS会根据注释内容给出代码编写提示,在调用类或方法时会更方便。

命名规范

两种命名规范:
(1)Pascal命名规范:每个单词的首字母大写,如:ProductType
(2)Camel命名规范:第一个单词的首字母小写,其他的大写
C#中推荐命名规则:
(1)类名使用Pascal命名规范
(2)方法使用Pascal规范命名
(3)变量和方法参数使用Camel命名规范
另:也可以加前缀表示变量类型。
例如:

public class HelloChina
{
    int totalCount = 0;
    void SayHelloToWho(string name)
    {
        string fullMessage = "Hello" + name;
    }
}

避免文件过大

如果一个类中的代码超过300行要考虑将代码分到不同的类中。
避免写太长的方法,一个较理想的方法的代码为1~25行,方法名应尽量体现其功能。
注:功能独立的方法应尽可能分开。

使用异常处理

在捕捉异常后一定要有相应的处理操作,不要仅为防止程序崩溃使用异常处理,也不能捕捉异常后不加以处理。
异常处理的一般策略:在开发程序的过程中尽可能暴露程序的问题,是设计人员尽可能解决这些程序的异常。在系统发布后尽可能隐藏程序的问题,在发生异常时尽可能不直接显示给用户,而是给出友好的提示。

内容参考清华大学出版社《C#程序设计实用教程(第二版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值