C# 抛出异常代码应该避免使用 System.Exception或ApplicationException
在.NET开发中,异常处理是确保程序健壮性和可靠性的关键部分。然而,许多开发者在编写代码时,可能会默认使用 System.Exception 或 ApplicationException 来抛出异常。这种做法虽然简单,但并不推荐。本文将探讨为什么应该避免使用这些通用异常,并提供更好的替代方案,以及如何结合这些最佳实践来优化你的代码。
为什么避免使用 ApplicationException 和 System.Exception
ApplicationException
ApplicationException 是 .NET 中的一个基本异常类型,它被设计为用户代码中的一个通用异常基类。然而,使用 ApplicationException 有几个缺点:
- 缺乏具体性:
ApplicationException没有提供关于错误的具体信息,这使得调试和错误处理变得更加困难。 - 可读性和可维护性差:使用更具体的异常类型可以提高代码的可读性和可维护性,让其他开发者能更快地理解出现问题的原因。
System.Exception
System.Exception 是所有异常类的基类。虽然它为异常处理提供了一个通用的框架,但在用户代码中直接使用 System.Exception 来抛出异常并不是最佳实践:
- 通用性过强:
System.Exception过于通用,没有提供关于错误的具体信息。 - 覆盖了特定异常:
System.Exception可能会覆盖一些特定的异常,这意味着如果你的代码捕获了System.Exception,那么所有继承自它的异常也会被捕获,这可能包括一些你并不打算处理的异常。
更好的选择
使用更具体的异常类型
.NET 提供了许多具体的异常类型,这些异常类型对应于特定的错误情况。例如:
ArgumentException或ArgumentNullException:当方法的参数不满足预期时使用。InvalidOperationException:当对象的状态不满足方法的预期时使用。KeyNotFoundException:当在字典或类似的集合中找不到键时使用。
使用这些具体的异常类型可以让代码的意图更加明确,也使得异常处理更加精确。
自定义异常类
对于特定的业务逻辑错误,自定义异常类型是一个很好的选择。这样可以让你的异常处理更加具体和清晰。例如:
public class ConfigurationException : Exception
{
public ConfigurationException(string message) : base(message) { }
} // 然后在代码中抛出自定义异常
if (sqlSugarConfigs == null || sqlSugarConfigs.Count < 1)
{
Console.WriteLine("未配置SqlSugarConfigs");
throw new ConfigurationException("未配置SqlSugarConfigs");
}
结合最佳实践
在实际开发中,结合使用具体的异常类型和自定义异常可以提供更清晰、更精确的异常处理。以下是一些建议:
- 优先使用.NET提供的特定异常类型:这些异常类型已经覆盖了许多常见的错误情况,使用它们可以提高代码的可读性和可维护性。
- 在必要时使用自定义异常:对于特定的业务逻辑错误,自定义异常可以提供更具体的信息,使得异常处理更加精确。
- 避免在用户代码中使用
ApplicationException和System.Exception:这些通用异常类型会降低代码的可读性和可维护性,并且可能会覆盖一些特定的异常。
总结
通过避免使用 ApplicationException 和 System.Exception,并转而使用更具体的异常类型或自定义异常,你可以提高代码的可读性、可维护性和异常处理的精确性。这不仅有助于调试和错误处理,还可以提高应用程序的健壮性和用户体验。记住,异常处理不仅仅是关于捕获错误,更是关于提供足够的信息来理解和解决问题。
C# 抛出异常代码应该避免使用 System.Exception或ApplicationException的更多相关文章
- “System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理
“System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理 其他信息: OCIEnvCreate 失败,返回代码为 -,但错误消息文本不可用. 如 ...
- 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...
- DataGridView 中发生以下异常: System.Exception: 是 不是 Decimal 的有效值。 ---> System.FormatException: 输入字符串的格式不正确。
其实之前我自己是没测出这个问题的,但是一放到测试的手上就出来了,原因我知道在哪里改输什么东西,但是人家不知道啊.报错如下: --------------------------- “DataGridV ...
- UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception
最近有一个需求,需要App监测网络变化,并在网络变化的同时用户,你切网啦,并且导航至一个切网的特定页面. 和Android.iOS的小伙伴后共同发现,人家有一个类似”拦截器“的框架,可以拦截App发出 ...
- “System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本” 的解决方案
在项目部署过程中ORACLE客户端多次会遇"System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&qu ...
- Do not throw System.Exception, System.SystemException, System.NullReferenceException, or System.IndexOutOfRangeException intentionally from your own source code
sonarqube的扫描结果提示 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/creatin ...
- System.Exception: ORA-12541: TNS: 无监听程序
今天在一个服务器上发布一个web服务(数据库也装在这台机器上):开发工具 Visual Studio 2008 Oracle但是部署好,浏览的时候报错了:System.Web.Services.Pro ...
- SSISWMI-Watching for the Wql query caused the following system exception: "Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"
将带有WMI WATCH TASK的SSIS包排到sql server agent跑,报异常,这是运行账号权限的问题. Executed as user: sss. Microsoft (R) ...
- 类库探源——System.Exception
一.MSDN描述 Exception 类: 表示在应用程序执行期间发生的错误 命名空间 : System 程序集: mscorlib.dll 继承关系: 常用属性(含字段)和方法: 1. 属性Me ...
- Idea 自定义快捷代码输入 如syso => System.out.println()
前言 之前一直用的Eclipse System.out.println()的快捷代码输入 是 syso,但是在Idea 不好使用了,后来搜索了一番才知道,在Idea中的快捷输入是 sout,这里我就想 ...
随机推荐
- explorer
explorer 是 Windows 下的一个实用命令. 实例 打开文件浏览器 explorer # 效果等同于快捷键操作 [Win + E] 使用默认浏览器打开链接 explorer "h ...
- git 取消 git add 操作
... 按照套路我们在对项目做了一些新增或修改操作后,会很自然的执行 git add 操作, 但是马上又发现好像添加的内容有点不对: 文件名错了 多了个符号 少了点什么 马上发现bug 等等... 总 ...
- 如何开发 MCP 服务?保姆级教程!
最近这段时间有个 AI 相关的概念特别火,叫 MCP,全称模型上下文协议(Model Context Protocol).这是由 Anthropic 推出的一项开放标准,目标是为大型语言模型和 AI ...
- Lua 的os.date()
Lua os.date() os.date## 原型:os.date ([format [, time]]) 解释:返回一个按format格式化日期.时间的字串或表. usage## 参数格式: 由原 ...
- JMeter递增加压总结
1.安装插件 a.下载JMeterPlugins-Standard.jar文件 下载链接:https://jmeter-plugins.org/downloads/old/ 下载完成后解压,将JMet ...
- Spring底层AOP代码实现
一. AOP功能测试 ①. pom.xml 依赖导入 ②. 目标类 ③. 切面类 ④. 配置类 ⑤. 测试类 二. AOP原理-@EnableAspectJAutoProxy AOP原理:[看给容器中 ...
- ReadWriteLock:读写锁
一. /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要"互斥" * 读读 不需要互斥 * */ public class TestReadWrite ...
- java 实现发送邮件功能
最近工作项目中需要使用到邮件功能,参考网上的文章,实现了一个基于java的邮件发送功能:直接上代码: 1.依赖 <dependency> <groupId>org.spring ...
- CSS定位的写法
如上图,商品添加完成后,需要验证商品是否添加成功,通过验证商品列表内是否存在指定名称的商品即可实现验证 浏览器自动获取的xpath=//*[@id="ProductName-divrid53 ...
- symfony学习笔记3.4(bundle、service、doctrine的使用…)
yii.laravel框架都是基于symfony组件衍生,symfony的强大不用多说.文档里有的,很好找的就不写了 附: symfony官网 https://symfony.com/doc/3.4 ...