参考文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/exceptions/
一. 概念
- 异常是最终全都派生自 System.Exception 的类型, 此类标识异常的类型,并包含详细描述异常的属性。
- 公共语言运行时 (CLR)、.NET Framework/任何第三方库或应用程序代码都可以生成异常。
- 在许多情况下,异常并不是由代码直接调用的方法抛出,而是由调用堆栈中再往下的另一方法抛出。 如果出现这种情况,CLR 会展开堆栈,同时针对特定异常类型查找包含 catch 代码块的方法,并执行找到的首个此类 catch 代码块。 如果在调用堆栈中找不到相应的 catch 代码块,将会终止进程并向用户显示消息。
二. 使用
-
一个不具有 catch
或
finally 块的 try 块会导致编译器错误。 -
如果引发异常之后没有在调用堆栈上找到兼容的 catch 块,则会出现以下三种情况之一:
- 如果异常存在于终结器内,将中止终结器,并调用基类终结器(如果有)。
- 如果调用堆栈包含静态构造函数或静态字段初始值设定项,将引发 TypeInitializationException,同时将原始异常分配给新异常的 InnerException 属性。
- 如果到达线程的开头,则终止线程。
三. 筛选
- 筛选想要处理的异常的一种方式是使用 catch 参数。 也可以使用异常筛选器进一步检查该异常以决定是否要对其进行处理(不修改堆栈)。 如果异常筛选器返回 false,则继续搜索处理程序:
catch (ArgumentException e) when (e.ParamName == "…")
{
}
四. 注意
- finally块不能写return,不然编译抱报错
- 如果 try 或 catch 运行到 return语音时,会先运行finally块,然后在返回
- finally修改部分类型无效
可用于理解的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project2
{
class MyExceptionText
{
class MyCustomException : Exception
{
public MyCustomException(string msg)
{
}
}
private static void TestThrow()
{
MyCustomException ex = new MyCustomException("Custom exception in TestThrow()");
throw ex;
}
static void Main()
{
System.Console.WriteLine("num = "+ h1());
Console.ReadLine();
}
static int h1()
{
int num = 10;
try
{
TestThrow();
System.Console.WriteLine("try");
// return num;
}
catch (MyCustomException ex)
{
System.Console.WriteLine("MyCustomException");
return num+=20;
}
finally
{
if(num > 20)
{
System.Console.WriteLine("num>20:"+num);
}
System.Console.WriteLine("finally");
num = 100;//此处无效
}
return num;
}
}
}
网友评论