Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图书馆中的异常处理策略_C#_.net_Exception_Exception Handling - Fatal编程技术网

C# 图书馆中的异常处理策略

C# 图书馆中的异常处理策略,c#,.net,exception,exception-handling,C#,.net,Exception,Exception Handling,在构建.NET库时,您的异常处理策略是什么?具体来说,关于在库调用中处理异常并将其暴露给调用代码,您的策略是什么 比如说, 您是否会将库函数视为其他函数,从而让它无法处理的所有异常按原样流出 是否为该库创建自定义异常 您会捕获所有异常并抛出库的异常吗?是否将原始异常设置为库的异常内部异常 库对数据库的依赖将如何影响异常处理策略 对于.NET库中的异常处理,您有什么建议和规则? 我让所有我认为用户能够处理的异常冒泡。这基本上是我认为他应该看到的东西(IO等) 我用一种更抽象的方式包装所有我想重

在构建.NET库时,您的异常处理策略是什么?具体来说,关于在库调用中处理异常并将其暴露给调用代码,您的策略是什么

比如说,

  • 您是否会将库函数视为其他函数,从而让它无法处理的所有异常按原样流出
  • 是否为该库创建自定义异常
  • 您会捕获所有异常并抛出库的异常吗?是否将原始异常设置为库的异常内部异常
  • 库对数据库的依赖将如何影响异常处理策略
对于.NET库中的异常处理,您有什么建议和规则?
  • 我让所有我认为用户能够处理的异常冒泡。这基本上是我认为他应该看到的东西(IO等)
  • 我用一种更抽象的方式包装所有我想重述的接收。在一个O/R映射器中,我有一个“DataAccessException”,它在内部获得任何SQL异常,因此用户不必处理其内部属性。这里的想法是,任何应用程序都可能想知道发生了SQL级别的异常,但无论如何都无法尝试修复它(由于数据库是多种类型中的一种),因此包装器很好
  • 在调试之外,我从不使用泛型捕获所有东西
  • 我总是有一个顶级处理程序(appdomain级别-unhandled exception event)来尝试向用户显示发生的意外异常并将其提交给支持人员
自定义异常-当它们有意义时。由于框架中的一些通用异常,情况并非如此

您是否会像对待其他函数一样对待库函数,从而让所有 它无法处理流出的异常 是这样吗

是的,这绝对是默认策略

是否为该库创建自定义异常

是的,如果呼叫者可以想象对这种情况做些什么,并且要做到这一点,他们需要能够将异常与其他异常区分开来。但这很少见

库对数据库的依赖将如何影响异常处理策略

数据库依赖关系可能需要公开允许调用方指定库如何处理某些异常的设置(例如,
MaximumDeadlockRetries

您会捕获所有异常并抛出库的异常吗? 你能设置原始的异常吗 作为图书馆内部的例外情况 例外


不,不是所有的例外。对于特定的异常,这是有可能的,尽管我能想到的唯一可能的情况是当我的库已经尝试处理异常时(如上面的数据库场景)而失败。

一个库封装了几个不同的类,这些类可能抛出不同的异常,因此不允许内部的异常作为其原始类型进行过滤。相反,它们应该包装在库特定的异常中,该异常应尽可能清楚地与异常的原始类型相关

例如,MagicDatabaseLibrary可能定义MagicDatabaseException,而MagicDatabaseTimeoutException又有一些派生异常MagicDatabaseTimeoutException、MagicDatabaseAuthenticationException等。如果SQL Server数据库抛出SQL Server超时异常(不管它叫什么),则应该将其包装在MagicDatabaseTimeoutException中。同样,对于可能发生的任何其他半预期异常

如果不这样做,调用库的代码将没有实际的选择,只有使用“Pokemon异常处理”,如果它希望处理潜在的数据库问题的话。例如,如果调用代码应该处理用户提供凭据登录数据库而连接失败的情况,那么它需要能够捕获该异常。如果调用代码不知道将出现什么类型的异常,那么除了捕获每个异常,希望它是由于不正确的凭据或其他原因,并向用户显示一条消息,说明连接失败之外,它无能为力。没有提供包装异常那么有用