c# 异常处理

异常类

.NET Framework 类库中的所有异常都派生于 Exception 类,异常包括系统异常和应用异常。

默认所有系统异常派生于 System.SystemException,所有的应用程序异常派生于 System.ApplicationException。

系统异常一般不可预测,比如内存堆栈溢出,空对象引用,权限限制,硬件读取错误等等。

应用程序异常一般可以预测,比如文件对象找不到啦,值不在范围内啦,数据类型不一致等等,设计,处理逻辑可以判断的。

常见的系统 异常类 说明

System.OutOfMemoryException 用 new 分配内存失败

System.StackOverflowException 递归过多、过深

System.NullReferenceException 对象为空

Syetem.IndexOutOfRangeException 数组越界

System.ArithmaticException 算术操作异常的基类

System.DivideByZeroException 除零错误

System.IO.IOException IO操作期间发生错误时引发的异常

System.Net.WebException 此异常与网络有关

System.Data.SqlClient.SqlException 异常与数据库(特别是SQLServer)有关

System.InvalidCastException 由于未定义强制类型转换而无法从一种类型转换为另一种类型时,将引发该错误

在 C# 语言中异常与异常处理语句

try ... catch... finally

try:

用于检查发生的异常,并帮助发送任何可能的异常。

catch:

以控制权更大的方式处理错误,可以有多个 catch 子句。

可将具有不同异常类的多个 catch 块链接在一起。 代码中 catch 块的计算顺序为从上到下,但针对引发的每个异常,仅执行一个 catch 块。 将执行指定所引发的异常的确切类型或基类的第一个 catch 块。 如果没有 catch 块指定匹配的异常类,则将选择不具有类型的 catch 块(如果语句中存在)。 务必首先定位具有最具体的(即,最底层派生的)异常类的 catch 块。

可以省略不使用。但catch 和finally 至少有一个。

finally:

无论是否引发了异常,finally 的代码块都将被执行。

可以省略不使用。但catch 和finally 至少有一个。

finally 块可用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。

throw:

异常都是使用 throw 关键字创建而成。当需要抛出一个异常时,或者自定义异常,可以用 throw 关键字.

string first = args.Length >= 1 ? args[0]

: throw new ArgumentException("Please supply at least one argument.");

异常过滤器

指定异常筛选器,该筛选器进一步检查异常并确定相应的 catch 块是否处理该异常。 异常筛选器是遵循 when 关键字的布尔表达式。布尔表达式为true,catch块就处理异常。布尔表达式为false,就跳过该异常。

try

{

var result = Process(-3, 4);

Console.WriteLine($"Processing succeeded: {result}");

}

catch (Exception e) when (e is ArgumentException || e is DivideByZeroException)

{

Console.WriteLine($"Processing failed: {e.Message}");

}

自定义异常

class MyException : Exception

{

public MyException(string message)

: base(message)

{

}

}

string first = args.Length >= 1 ? args[0]

: throw new MyException("Please supply at least one argument.");

注意:
  1. 较高层次上下文捕捉较低抛出的异常。

try

{

// Code to try goes here.

}

catch (SomeSpecificException ex)

{

// Code to handle the exception goes here.

}

Finally

{

// Code to execute after the try (and possibly catch) blocks // goes here.

}

FileStream? file = null;

FileInfo fileinfo = new System.IO.FileInfo("./file.txt");

Try

{

file = fileinfo.OpenWrite();

file.WriteByte(0xF);

}

finally

{ // Check for null because OpenWrite might have failed.

file?.Close();

}

相关推荐
L X..2 小时前
Unity 光照贴图异常修复笔记
unity·c#·游戏引擎
reasonsummer4 小时前
【办公类-115-06】20250920职称资料上传04——docx复制、docx转PDF(课程表11个)
开发语言·windows·python·c#
William_cl19 小时前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc
c#上位机1 天前
wpf之命令
c#·wpf
曹牧1 天前
C#:函数默认参数
开发语言·c#
R-G-B1 天前
【02】C#入门到精通——C# 变量、输入/输出、类型转换
开发语言·c#·c# 变量·c#输入/输出·c#类型转换
星河队长1 天前
C# 软件加密方法,有使用时间限制,同时要防止拷贝
开发语言·c#
Aevget2 天前
DevExpress WinForms v25.1亮点 - PDF Viewer(查看器)等全新升级
pdf·c#·界面控件·winform·devexpress·ui开发
InCerry2 天前
为 .NET 10 GC(DATAS)做准备
性能优化·c#·.net·gc
曹牧2 天前
C#:可选参数
开发语言·c#