C# 图书馆中的异常处理策略
在构建.NET库时,您的异常处理策略是什么?具体来说,关于在库调用中处理异常并将其暴露给调用代码,您的策略是什么 比如说,C# 图书馆中的异常处理策略,c#,.net,exception,exception-handling,C#,.net,Exception,Exception Handling,在构建.NET库时,您的异常处理策略是什么?具体来说,关于在库调用中处理异常并将其暴露给调用代码,您的策略是什么 比如说, 您是否会将库函数视为其他函数,从而让它无法处理的所有异常按原样流出 是否为该库创建自定义异常 您会捕获所有异常并抛出库的异常吗?是否将原始异常设置为库的异常内部异常 库对数据库的依赖将如何影响异常处理策略 对于.NET库中的异常处理,您有什么建议和规则? 我让所有我认为用户能够处理的异常冒泡。这基本上是我认为他应该看到的东西(IO等) 我用一种更抽象的方式包装所有我想重
- 您是否会将库函数视为其他函数,从而让它无法处理的所有异常按原样流出
- 是否为该库创建自定义异常李>
- 您会捕获所有异常并抛出库的异常吗?是否将原始异常设置为库的异常内部异常
- 库对数据库的依赖将如何影响异常处理策略
- 我让所有我认为用户能够处理的异常冒泡。这基本上是我认为他应该看到的东西(IO等)
- 我用一种更抽象的方式包装所有我想重述的接收。在一个O/R映射器中,我有一个“DataAccessException”,它在内部获得任何SQL异常,因此用户不必处理其内部属性。这里的想法是,任何应用程序都可能想知道发生了SQL级别的异常,但无论如何都无法尝试修复它(由于数据库是多种类型中的一种),因此包装器很好
- 在调试之外,我从不使用泛型捕获所有东西
- 我总是有一个顶级处理程序(appdomain级别-unhandled exception event)来尝试向用户显示发生的意外异常并将其提交给支持人员
MaximumDeadlockRetries
)
您会捕获所有异常并抛出库的异常吗?
你能设置原始的异常吗
作为图书馆内部的例外情况
例外
不,不是所有的例外。对于特定的异常,这是有可能的,尽管我能想到的唯一可能的情况是当我的库已经尝试处理异常时(如上面的数据库场景)而失败。一个库封装了几个不同的类,这些类可能抛出不同的异常,因此不允许内部的异常作为其原始类型进行过滤。相反,它们应该包装在库特定的异常中,该异常应尽可能清楚地与异常的原始类型相关 例如,MagicDatabaseLibrary可能定义MagicDatabaseException,而MagicDatabaseTimeoutException又有一些派生异常MagicDatabaseTimeoutException、MagicDatabaseAuthenticationException等。如果SQL Server数据库抛出SQL Server超时异常(不管它叫什么),则应该将其包装在MagicDatabaseTimeoutException中。同样,对于可能发生的任何其他半预期异常 如果不这样做,调用库的代码将没有实际的选择,只有使用“Pokemon异常处理”,如果它希望处理潜在的数据库问题的话。例如,如果调用代码应该处理用户提供凭据登录数据库而连接失败的情况,那么它需要能够捕获该异常。如果调用代码不知道将出现什么类型的异常,那么除了捕获每个异常,希望它是由于不正确的凭据或其他原因,并向用户显示一条消息,说明连接失败之外,它无能为力。没有提供包装异常那么有用