库中的异常处理策略

时间:2010-05-04 12:08:08

标签: c# .net exception exception-handling

3 个答案:

答案 0 :(得分:2)

  • 我让所有异常泡沫我认为用户可以处理。这基本上是我认为他应该期待的东西(IO等)
  • 我用更抽象的方式包装我想要重新抛出的所有例子。在O / R映射器中,我有一个“DataAccessException”,它在内部得到任何SQL异常 - 因此用户不必处理它们的内在函数。这里的想法是,任何应用程序可能想知道发生的SQL级别异常,但无论如何都无法尝试修复它(感谢数据库是众多类型之一等) - 所以包装器很好。
  • 我从未在调试之外使用泛型捕获所有东西。
  • 我总是有一个顶级处理程序(appdomain级别 - 未处理的异常事件),试图向用户显示发生意外的异常并将其提交给支持。

自定义例外 - 当它们有意义时。由于框架中存在一些通用异常,情况并非如此。

答案 1 :(得分:1)

  

你会把库函数视为任何其他函数,从而让所有人都可以   例外,它无法处理流出   它原样?

是的,这绝对是默认策略。

  

您是否会为该库创建自定义例外?

是的,如果呼叫者可以想象做一些关于的情况,他们需要能够将异常与其他异常区分开来。但这种情况非常罕见。

  

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

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

  

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

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

答案 2 :(得分:0)

包含几个可能抛出不同异常的不同类的库应该允许IMHO不允许来自内部的异常渗透为其原始类型。相反,它们应该包含在特定于库的异常中,尽可能清楚地与异常的原始类型相关。

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

如果没有这样做,那么调用库的代码将没有实际选择,但如果它有希望处理潜在的数据库问题,则使用“Pokemon异常处理”。例如,如果调用代码应该处理用户提供凭据以登录数据库并且连接失败的情况,则需要能够捕获该异常。如果调用代码不知道将是什么类型的异常,除了捕获每个异常之外它没有多少可做,希望它是由不正确的凭证或其他东西产生的,并向用户显示一条消息说连接失败。不像提供包装异常那样有用。