在.NET开发中,异常处理是确保程序健壮性和可靠性的关键部分。然而,许多开发者在编写代码时,可能会默认使用 System.ExceptionApplicationException 来抛出异常。这种做法虽然简单,但并不推荐。本文将探讨为什么应该避免使用这些通用异常,并提供更好的替代方案,以及如何结合这些最佳实践来优化你的代码。

为什么避免使用 ApplicationException 和 System.Exception

ApplicationException

ApplicationException 是 .NET 中的一个基本异常类型,它被设计为用户代码中的一个通用异常基类。然而,使用 ApplicationException 有几个缺点:

  1. 缺乏具体性:ApplicationException 没有提供关于错误的具体信息,这使得调试和错误处理变得更加困难。
  2. 可读性和可维护性差:使用更具体的异常类型可以提高代码的可读性和可维护性,让其他开发者能更快地理解出现问题的原因。

System.Exception

System.Exception 是所有异常类的基类。虽然它为异常处理提供了一个通用的框架,但在用户代码中直接使用 System.Exception 来抛出异常并不是最佳实践:

  1. 通用性过强:System.Exception 过于通用,没有提供关于错误的具体信息。
  2. 覆盖了特定异常: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");
}

  

结合最佳实践

在实际开发中,结合使用具体的异常类型和自定义异常可以提供更清晰、更精确的异常处理。以下是一些建议:

  1. 优先使用.NET提供的特定异常类型:这些异常类型已经覆盖了许多常见的错误情况,使用它们可以提高代码的可读性和可维护性。
  2. 在必要时使用自定义异常:对于特定的业务逻辑错误,自定义异常可以提供更具体的信息,使得异常处理更加精确。
  3. 避免在用户代码中使用 ApplicationException 和 System.Exception:这些通用异常类型会降低代码的可读性和可维护性,并且可能会覆盖一些特定的异常。

总结

通过避免使用 ApplicationExceptionSystem.Exception,并转而使用更具体的异常类型或自定义异常,你可以提高代码的可读性、可维护性和异常处理的精确性。这不仅有助于调试和错误处理,还可以提高应用程序的健壮性和用户体验。记住,异常处理不仅仅是关于捕获错误,更是关于提供足够的信息来理解和解决问题。

C# 抛出异常代码应该避免使用 System.Exception或ApplicationException的更多相关文章

  1. “System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理

    “System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理 其他信息: OCIEnvCreate 失败,返回代码为 -,但错误消息文本不可用. 如 ...

  2. 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常

    建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...

  3. DataGridView 中发生以下异常: System.Exception: 是 不是 Decimal 的有效值。 ---> System.FormatException: 输入字符串的格式不正确。

    其实之前我自己是没测出这个问题的,但是一放到测试的手上就出来了,原因我知道在哪里改输什么东西,但是人家不知道啊.报错如下: --------------------------- “DataGridV ...

  4. UWP 在ShellPage.xaml.cs 中导航至其他页面引发System.Exception

    最近有一个需求,需要App监测网络变化,并在网络变化的同时用户,你切网啦,并且导航至一个切网的特定页面. 和Android.iOS的小伙伴后共同发现,人家有一个类似”拦截器“的框架,可以拦截App发出 ...

  5. “System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本” 的解决方案

    在项目部署过程中ORACLE客户端多次会遇"System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&qu ...

  6. 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 ...

  7. System.Exception: ORA-12541: TNS: 无监听程序

    今天在一个服务器上发布一个web服务(数据库也装在这台机器上):开发工具 Visual Studio 2008 Oracle但是部署好,浏览的时候报错了:System.Web.Services.Pro ...

  8. 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) ...

  9. 类库探源——System.Exception

    一.MSDN描述 Exception 类: 表示在应用程序执行期间发生的错误 命名空间 : System 程序集:   mscorlib.dll 继承关系: 常用属性(含字段)和方法: 1. 属性Me ...

  10. Idea 自定义快捷代码输入 如syso => System.out.println()

    前言 之前一直用的Eclipse System.out.println()的快捷代码输入 是 syso,但是在Idea 不好使用了,后来搜索了一番才知道,在Idea中的快捷输入是 sout,这里我就想 ...

随机推荐

  1. explorer

    explorer 是 Windows 下的一个实用命令. 实例 打开文件浏览器 explorer # 效果等同于快捷键操作 [Win + E] 使用默认浏览器打开链接 explorer "h ...

  2. git 取消 git add 操作

    ... 按照套路我们在对项目做了一些新增或修改操作后,会很自然的执行 git add 操作, 但是马上又发现好像添加的内容有点不对: 文件名错了 多了个符号 少了点什么 马上发现bug 等等... 总 ...

  3. 如何开发 MCP 服务?保姆级教程!

    最近这段时间有个 AI 相关的概念特别火,叫 MCP,全称模型上下文协议(Model Context Protocol).这是由 Anthropic 推出的一项开放标准,目标是为大型语言模型和 AI ...

  4. Lua 的os.date()

    Lua os.date() os.date## 原型:os.date ([format [, time]]) 解释:返回一个按format格式化日期.时间的字串或表. usage## 参数格式: 由原 ...

  5. JMeter递增加压总结

    1.安装插件 a.下载JMeterPlugins-Standard.jar文件 下载链接:https://jmeter-plugins.org/downloads/old/ 下载完成后解压,将JMet ...

  6. Spring底层AOP代码实现

    一. AOP功能测试 ①. pom.xml 依赖导入 ②. 目标类 ③. 切面类 ④. 配置类 ⑤. 测试类 二. AOP原理-@EnableAspectJAutoProxy AOP原理:[看给容器中 ...

  7. ReadWriteLock:读写锁

    一. /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要"互斥" * 读读 不需要互斥 * */ public class TestReadWrite ...

  8. java 实现发送邮件功能

    最近工作项目中需要使用到邮件功能,参考网上的文章,实现了一个基于java的邮件发送功能:直接上代码: 1.依赖 <dependency> <groupId>org.spring ...

  9. CSS定位的写法

    如上图,商品添加完成后,需要验证商品是否添加成功,通过验证商品列表内是否存在指定名称的商品即可实现验证 浏览器自动获取的xpath=//*[@id="ProductName-divrid53 ...

  10. symfony学习笔记3.4(bundle、service、doctrine的使用…)

    yii.laravel框架都是基于symfony组件衍生,symfony的强大不用多说.文档里有的,很好找的就不写了 附: symfony官网  https://symfony.com/doc/3.4 ...