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

windowsC#-创建和引发异常

异常用于指示在运行程序时发生了错误。 此时将创建一个描述错误的异常对象,然后使用 throw 语句或表达式引发。 然后,运行时搜索最兼容的异常处理程序。

当存在下列一种或多种情况时,程序员应引发异常:

1. 方法无法完成其定义的功能。 例如,如果一种方法的参数具有无效的值:

static void CopyObject(SampleClass original)
{_ = original ?? throw new ArgumentException("Parameter cannot be null", nameof(original));
}

2. 根据对象的状态,对某个对象进行不适当的调用。 一个示例可能是尝试写入只读文件。 在对象状态不允许操作的情况下,引发 InvalidOperationException 的实例或基于此类的派生的对象。 以下代码是引发 InvalidOperationException 对象的方法示例: 

public class ProgramLog
{FileStream logFile = null!;public void OpenLog(FileInfo fileName, FileMode mode) { }public void WriteLog(){if (!logFile.CanWrite){throw new InvalidOperationException("Logfile cannot be read-only");}// Else write data to the log and return.}
}

3. 方法的参数引发了异常。 在这种情况下,应捕获原始异常,并创建 ArgumentException 实例。 应将原始异常作为 InnerException 参数传递给 ArgumentException 的构造函数:

static int GetValueFromArray(int[] array, int index)
{try{return array[index];}catch (IndexOutOfRangeException e){throw new ArgumentOutOfRangeException("Parameter index is out of range.", e);}
}

前面的示例演示了如何使用 InnerException 属性。 这是有意简化的。 在实践中,应先检查索引是否在范围内,然后再使用它。 当参数成员引发在调用成员之前无法预料到的异常时,可以使用此方法来包装异常。

异常包含一个名为 StackTrace 的属性。 此字符串包含当前调用堆栈上的方法的名称,以及为每个方法引发异常的位置(文件名和行号)。 StackTrace 对象由公共语言运行时 (CLR) 从 throw 语句的位置点自动创建,因此必须从堆栈跟踪的开始点引发异常。

所有异常都包含一个名为 Message 的属性。 应设置此字符串来解释发生异常的原因。 不应将安全敏感的信息放在消息文本中。 除 Message 以外,ArgumentException 也包含一个名为 ParamName 的属性,应将该属性设置为导致引发异常的参数的名称。 在属性资源库中,ParamName 应设置为 value。

公共的受保护方法在无法完成其预期功能时将引发异常。 引发的异常类是符合错误条件的最具体的可用异常。 这些异常应编写为类功能的一部分,并且原始类的派生类或更新应保留相同的行为以实现后向兼容性。

引发异常时应避免的情况

以下列表标识了引发异常时要避免的做法:

  • 不要使用异常在正常执行过程中更改程序的流。 使用异常来报告和处理错误条件;
  • 只能引发异常,而不能作为返回值或参数返回异常;
  • 请勿有意从自己的源代码中引发 System.Exception、System.SystemException、System.NullReferenceException 或 System.IndexOutOfRangeException;
  • 不要创建可在调试模式下引发,但不会在发布模式下引发的异常。 若要在开发阶段确定运行时错误,请改用调试断言;
任务返回方法中的异常

使用 async 修饰符声明的方法在出现异常时,有一些特殊的注意事项。 方法 async 中引发的异常会存储在返回的任务中,直到任务即将出现时才会出现。 有关存储的异常的详细信息,请参阅异步异常。

建议在输入方法的异步部分之前验证参数并引发任何相应的异常,例如 ArgumentException 和 ArgumentNullException。 也就是说,在开始工作之前,这些验证异常应同步出现。 以下代码片段演示了一个示例,其中,如果引发异常,ArgumentException 个异常将同步出现,而 InvalidOperationException 个将存储在返回的任务中。

// Non-async, task-returning method.
// Within this method (but outside of the local function),
// any thrown exceptions emerge synchronously.
public static Task<Toast> ToastBreadAsync(int slices, int toastTime)
{if (slices is < 1 or > 4){throw new ArgumentException("You must specify between 1 and 4 slices of bread.",nameof(slices));}if (toastTime < 1){throw new ArgumentException("Toast time is too short.", nameof(toastTime));}return ToastBreadAsyncCore(slices, toastTime);// Local async function.// Within this function, any thrown exceptions are stored in the task.static async Task<Toast> ToastBreadAsyncCore(int slices, int time){for (int slice = 0; slice < slices; slice++){Console.WriteLine("Putting a slice of bread in the toaster");}// Start toasting.await Task.Delay(time);if (time > 2_000){throw new InvalidOperationException("The toaster is on fire!");}Console.WriteLine("Toast is ready!");return new Toast();}
}
定义异常的类别

程序可以引发 System 命名空间中的预定义异常类(前面提到的情况除外),或通过从 Exception 派生来创建其自己的异常类。 派生类应该至少定义三个构造函数:一个无参数构造函数、一个用于设置消息属性,还有一个用于设置 Message 和 InnerException 属性。 例如:

[Serializable]
public class InvalidDepartmentException : Exception
{public InvalidDepartmentException() : base() { }public InvalidDepartmentException(string message) : base(message) { }public InvalidDepartmentException(string message, Exception inner) : base(message, inner) { }
}

当新属性提供的数据有助于解决异常时,将新属性添加到异常类中。 如果将新属性添加到派生异常类中,则应替代 ToString() 以返回添加的信息。 

相关文章:

windowsC#-创建和引发异常

异常用于指示在运行程序时发生了错误。 此时将创建一个描述错误的异常对象&#xff0c;然后使用 throw 语句或表达式引发。 然后&#xff0c;运行时搜索最兼容的异常处理程序。 当存在下列一种或多种情况时&#xff0c;程序员应引发异常&#xff1a; 1. 方法无法完成其定义的…...

python爬虫案例——请求的网页源码被加密,解密方法全过程(19)

文章目录 1、任务目标2、网页分析3、代码编写1、任务目标 目标网站:https://jzsc.mohurd.gov.cn/data/company,该网站的网页源码被加密了,用于本文测验 要求:解密该网站的网页源码,请求网站并返回解密后的明文数据,网页内容如下: 2、网页分析 进入网站,打开开发者模式,…...

详解广告联盟

某种程度上&#xff0c;动荡的程度甚于以往。产业链中快速挤进了众多不曾有过的角色&#xff0c;产业逻辑被完全颠覆。巨大的变化在几年间迅速产生&#xff0c;源头是快速发展的互联网和科技。 这个行业走到了十字路口&#xff0c;身处其中的大多数人感到乐观&#xff0c;但同…...

Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)

Hi again. 嗨了。 Ready to get back into it? 准备好重新开始了吗&#xff1f; Let’s go. Time estimation, 我们走吧。时间估计, effort estimation, 努力估计, and capacity planning are all helpful techniques for creating your project schedule. 容量规划都是创建项…...

攻防世界35-easyupload-CTFWeb

攻防世界35-easyupload-CTFWeb 通过各种上传发现&#xff0c;过滤了php后缀和内容中有php的文件 有这几种方式上传一句话木马 <script language"php">eval($_POST[1]);</script> <?php eval($_POST[cmd]);?> <? eval($_POST[cmd]);?>…...

在Mysql中,如何定位慢查询

参考回答&#xff1a;之前我们有个项目做压测的时候有的接口非常的慢&#xff0c;接口的响应时间超过了2秒以上&#xff0c;因为在MySOL中也提供了慢日志查询的功能&#xff0c;可以在MySOL的系统配置文件中开启这个慢日志的功能&#xff0c;并且也可以设置SOL执行超过多少时间…...

CSS教程(三)- CSS 三大特性

1. 层叠性 介绍 多组CSS样式共同作用于一个元素&#xff0c;就会出现 覆盖&#xff08;层叠&#xff09; 另一个冲突的样式。 层叠原则 样式冲突&#xff1a;遵循就近原则&#xff08;哪个样式离结构近&#xff0c;就执行哪个样式&#xff09; 样式不冲突&#xff0c;就不会重…...

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…...

【IC每日一题:IC验证面试--UVM验证-2】

IC每日一题&#xff1a;IC验证面试--UVM验证-2 2.9 get_next_iterm()和try_next_item()的区别&#xff1f;2.10 一个典型的UVM验证平台&#xff0c;谈一下UVM验证环境结构&#xff0c;各个组件之间的关系&#xff1f;2.11 uvm组件之间通信的方式&#xff1f; analysis_port和其…...

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章&#xff0c;港科大陈启峰也挂了名字。从首页图看效果确实很惊艳&#xff0c;尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成&#xff0c;对原图内容并不是很复原&…...

#揭秘万维网:从静态页面到智能互联网

揭秘万维网&#xff1a;从静态页面到智能互联网 今天刚上了学校开设的课程&#xff0c;于是便有了下文的思考内容。 在当今数字化时代&#xff0c;Web&#xff08;万维网&#xff09;扮演着重要的角色&#xff0c;成为人们获取信息、沟通交流和进行商业活动的主要平台。 1. …...

【计算机基础——数据结构——红黑树】

1. 红黑树&#xff08;RBTree&#xff09; 为什么HashMap不直接使用AVL树&#xff0c;而是选择了红黑树呢&#xff1f; 由于AVL树必须保证左右子树平衡&#xff0c;Max(最大树高-最小树高) < 1&#xff0c;所以在插入的时候很容易出现不平衡的情况&#xff0c;一旦这样&…...

Sentinel — 微服务保护

微服务架构将大型应用程序拆分为多个小而独立的服务&#xff0c;每个服务可以独立部署和扩展。然而&#xff0c;微服务系统需要面对的挑战也随之增加&#xff0c;例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此&#xff0c;微服务保护措施是确保系统在高并发、资…...

Cynet:全方位一体化安全防护工具

前言 1999年&#xff0c;布鲁斯施奈尔曾说过&#xff1a;“复杂性是安全最大的敌人。”彼时还是19年前&#xff0c;而现在&#xff0c;网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件&#xff0c;看似具有相当强的防护能力。 根据Cynet的描…...

python中常见的8种数据结构之一数组的应用

在Python中&#xff0c;数组是一种常见的数据结构&#xff0c;用于存储一系列相同类型的元素。在实际应用中&#xff0c;数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用&#xff1a; 1. 存储和访问数据&#xff1a;数组可以用于存储和访问一组数据。可以通过…...

安装多个低版本谷歌Chrome浏览器用于测试,适配Vue3+vite项目

安装多个低版本谷歌Chrome浏览器用于测试&#xff0c;适配Vue3vite项目 问题&#xff1a;使用vue3tsvite搭建了一个项目&#xff0c;在chrome新版本浏览器上无问题&#xff0c;但是部署到现场页面直接空白&#xff0c;且控制台报错&#xff1a; Uncaugnt SyntaxError: Unexpe…...

UI组件---如何设置el-pagination分页组件的背景色

1. 要替换 el-pagination 组件的背景色&#xff0c;您可以通过自定义CSS来实现。 具体的CSS规则取决于您想要更改的是哪个部分的背景色&#xff0c;例如普通页码、活跃页码、上下导航箭头等。以下是一些示例CSS规则&#xff0c;您可以根据自己的需求进行调整&#xff1a; /* …...

LabVIEW编程过程中为什么会出现bug?

在LabVIEW编程过程中&#xff0c;Bug的产生往往源自多方面原因。以下从具体的案例角度分析一些常见的Bug成因和调试方法&#xff0c;以便更好地理解和预防这些问题。 ​ 1. 数据流错误 案例&#xff1a;在一个LabVIEW程序中&#xff0c;多个计算节点依赖相同的输入数据&#…...

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…...

RK android14 第三方app获取su权限

需要修改的地方如下 frameworks/base/core/jni/com_android_internal_os_Zygote.cpp kernel-6.1/security/commoncap.c system/core/init/selinux.cpp system/core/libcutils/fs_config.cpp system/extras/su/su.cpp device/rockchip/common/BoardConfig.mk device/rockchip…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...