转:C# 捕获异常try...catch...finally(比较全)

原文:http://blog.csdn.net/lulu_jiang/article/details/5685675

   http://blog.csdn.net/lulu_jiang/article/details/5685932

   http://blog.csdn.net/lulu_jiang/article/details/5686324

 

 

[c-sharp] view plaincopy
 

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处理捕获所有异常
*/
}
}

 

 

注:一般编写一个可执行程序,应捕获异常,编写一个库,最好不要捕获,要假定调用代码可以处理

 

 

 

1.自定义异常类

 

using System;

namespace ConsoleApplication3
{
//自定义异常类,继承ApplicationException类
class MyException : ApplicationException
{
//自定义异常类构造函数调用基类构造函数
public MyException(string message)
: base("自定义错误:" + message)
{}

public MyException(string message, Exception innerException)
: base("自定义错误:" + message, innerException)
{ }
}
}

 

 

2.控制台应用入口

static void Main(string[] args)
{
try
{
if (true)
{
//抛出自定义异常
throw new MyException("抛出我的异常");
}
}
//捕获自定义异常
catch(MyException e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("结束!");

Console.ReadLine();
}
}

 

 

 

 

 

 

 

C#嵌套try块工作原理

static void Main(string[] args)
{
/* 嵌套try块
* try
* {
* //A
* try
* {
* //B
* }
* catch
* {
* //C
* }
* finally
* {
* //D
* }
* //E
* }
* catch
* { ... }
* finally
* { ... }
*
* 抛出异常在:内层A,E处由外层catch块捕获,并执行外层finally
* 抛出异常在:内层B处,且有一合适内层catch捕获,执行内层finally,后执行E处
* 抛出异常在:内层B处,但内层catch块没有合适处理程序,执行内层finally,搜索外层catch,找合适的,执行外层finally,此时不会执行E
* 抛出异常在:内层C处,退出内层catch块,执行内层finally,搜索外层catch,找到合适,执行外层finally
* 抛出异常在:内层D处,退出内层finally块,搜索外层catch,找到合适,执行外层finally
*/

/* 使用嵌套块的原因:
* 1.修改所抛出的异常类型
* 2.在代码的不同地方处理不同类型的异常
*/
}

 

注:在catch,finally块中抛出异常是可以的

posted @   阿玛  阅读(429)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示