class Program { static void Main(string[] args) { string userInput; while (true) { try { Console.WriteLine("输入0到5:"); userInput = Console.ReadLine(); if (userInput == "") { //当用户输入""时,跳出try和while但任然执行finally的内容 break; } int index = Convert.ToInt32(userInput); if (index < 0 || index > 5) { //抛出异常 //可使用System.Exception类,但它是个基本类,没有包含特定错误信息 //此处用派生类IndexOutOfRangeException throw new IndexOutOfRangeException("你输入了:" + userInput + "超出范围!"); } Console.WriteLine("你输入了:" + index); } //传递给catch块的参数只能用于该catch块,因此后续catch块任然可用同名参数ex catch (IndexOutOfRangeException ex) { Console.WriteLine("抛出异常:" + ex.Message); } //如果没有在前面catch块中捕获的异常类,这个也能处理IndexOutOfRangeException //计算机只执行它在catch块列表中找到的第一个合适catch块 //基类的一个引用可以指向派生于它的所有类实例 //因此,最上面的catch块因应用于最特殊的异常情况,最后的是最一般的catch块 catch (Exception ex) { Console.WriteLine("抛出异常:" + ex.Message); } //最一般catch块(不带参数),用于处理其他没用C#编写的代码抛出的异常 //C#中只有派生于System.Exception类的实例才能作为异常来抛出,其他语言没这个限制 //此catch块同样能捕获全部异常,只是不知异常的详细信息 catch { //因为我们不知道这个异常表示什么类 Console.WriteLine("其他异常!"); } //无论执行try,catch最后都将执行finally块 finally { Console.WriteLine("谢谢!"); } } /* 没有处理异常时发生的情况 * 生成一个异常后,代码中没有catch块能处理这异常,由.NET运行库捕获 * .NET运行库把整个程序放在另一个更大的try块中,用一个catch处理捕获所有异常 */ } } 注:一般编写一个可执行程序,应捕获异常,编写一个库,最好不要捕获,要假定调用代码可以处理