当前位置: 首页 > news >正文

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();

}

相关文章:

  • 音视频数字化(数字与模拟-电视)
  • LACP——链路聚合控制协议
  • Superset二次开发之Markdown嵌入图片
  • YOLO如何训练自己的模型
  • Swagger接口文档管理工具
  • 【EFK】基于K8S构建EFK+logstash+kafka日志平台
  • EAP-TLS实验之Ubuntu20.04环境搭建配置(FreeRADIUS3.0)(四)
  • ubuntu开发板问题汇总
  • Sentinel 动态规则扩展
  • 设计模式篇---观察者模式
  • 4.5.CVAT——视频标注的详细步骤
  • 皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜
  • 【Linux】实时查看服务器信息
  • 架构面试题汇总(一)
  • 从0到1实现五子棋游戏!!
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [deviceone开发]-do_Webview的基本示例
  • [Vue CLI 3] 配置解析之 css.extract
  • 【Leetcode】104. 二叉树的最大深度
  • 【RocksDB】TransactionDB源码分析
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Android开源项目规范总结
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Go 语言编译器的 //go: 详解
  • hadoop集群管理系统搭建规划说明
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对JS继承的一点思考
  • 复杂数据处理
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 手写一个CommonJS打包工具(一)
  • 突破自己的技术思维
  • 我从编程教室毕业
  • 源码安装memcached和php memcache扩展
  • 运行时添加log4j2的appender
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • (175)FPGA门控时钟技术
  • (C++20) consteval立即函数
  • (WSI分类)WSI分类文献小综述 2024
  • (第27天)Oracle 数据泵转换分区表
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)(官方)UE4--图像编程----着色器开发
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core 项目指定SDK版本
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET构架之我见
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#基础]说说lock到底锁谁?
  • [C++]AVL树怎么转
  • [C++]二叉搜索树