13.异常与调试
在编程中不可避免地会出现一些错误,错误主要包括编译错误和逻辑错误。
13.1 Exception:异常类
.NET Framework
类库中的所有异常都派生于Exception类,异常包括系统异常和应用异常。默认所有系统异常派生于System.SystemException,所有的应用程序异常派生于System.ApplicationException。
常用的系统异常类如下表所示。
异常类 | 说明 |
---|---|
System.OutOfMemoryException | 用 new 分配内存失败 |
System.StackOverflowException | 递归过多、过深 |
System.NullReferenceException | 对象为空 |
Syetem.IndexOutOfRangeException | 数组越界 |
System.ArithmaticException | 算术操作异常的基类 |
System.DivideByZeroException | 除零错误 |
13.2 异常处理
异常处理用到关键字如下:
- try:用于检查发生的异常,并帮助发送任何可能的异常。
- catch:以控制权更大的方式处理错误,可以有多个catch子句。
- finally:无论是否引发了异常,finally的代码块都将被执行。
using System;
class Program
{
static void Main(string[] args)
{
//定义存放5个整数的数组
int[] a = new int[5];
try
{
for (int i = 0; i < a.Length; i++)
{
a[i] = int.Parse(Console.ReadLine());
}
for (int i = 0; i < a.Length; i++)
{
Console.Write(a[i] + " ");
}
}
catch (FormatException f)
{
Console.WriteLine("输入的数字格式不正确!");
}
catch (OverflowException o)
{
Console.WriteLine("输入的值已经超出int类型的最大值!");
}
catch (IndexOutOfRangeException r)
{
Console.WriteLine("数组越界异常!");
}
finally
{
Console.WriteLine("执行Finally语句");
}
}
}
13.3 自定义异常
声明异常语句如下。
class 异常类名:Exception
{
}
抛出异常语句如下。
throw(异常类名);
下面的例子限制输入的整数在0-100之间。
using System;
class MyException : Exception
{
public MyException(string message) : base(message)
{
}
}
class Program
{
static void Main(string[] args)
{
try
{
int age = int.Parse(Console.ReadLine());
if (age < 18 || age > 45)
{
throw new MyException("整数值必须在0-100之间!");
}
else
{
Console.WriteLine("输入的整数合法!");
}
}
// 自定义异常类
catch (MyException myException)
{
Console.WriteLine(myException.Message);
}
// 异常类
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
// 103
// 整数值必须在0-100之间!
13.4 输出调试信息
通常用Debug
类或Trace
类实现调试时输出调试信息,在System.Diagnostics
命名空间中。
Debug.WriteLine();
Trace.WriteLine();
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
string[] str = new string[5];
Debug.WriteLine("开始向数组中存值:");
for (int i = 0; i < str.Length; i++)
{
str[i] = Console.ReadLine();
Debug.WriteLine("存入的第{0}个值为{1}", i, str[i]);
}
Debug.WriteLine("向数组中存值结束!");
}
}
在程序中设置断点,按F5开始调试,逐步执行完程序。输出界面如下。
使用Trace类也能完成同样的效果,只需将上述代码中的Debug类换成Trace类即可。Trace类的WriteLine方法中的参数不支持上述代码中Debug类的WriteLine方法的参数形式,只能传递字符串。
需要注意的是当程序在Debug状态下执行时使用Debug类打印的信息才会在输出窗口中显示,在Release状态下执行时只有Trace类输出的内容才会显示在输出窗口中。