代码之家  ›  专栏  ›  技术社区  ›  Asaf R

库中的异常处理策略

  •  5
  • Asaf R  · 技术社区  · 15 年前

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

    例如,

    • 您是否将库函数视为其他函数,从而让它无法处理的所有异常按原样流出?
    • 您能为那个库创建一个自定义异常吗?
    • 您会捕获所有异常并改为抛出库的异常吗?是否将原始异常设置为库的异常内部异常?
    • 库对数据库的依赖性如何影响异常处理策略?

    对于.NET库中的异常处理,您建议使用哪些准则和规则?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jeff Sternal    15 年前

    你会把一个图书馆的功能当作其他功能来对待吗,从而让所有的 它无法处理流出的异常 是这样吗?

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

    您能为那个库创建一个自定义异常吗?

    是的,如果打电话的人可以想当然地对这种情况做些什么的话 要做到这一点,他们需要能够区分异常和其他异常。但这很罕见。

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

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

    您会捕获所有异常并改为抛出库的异常吗? 你能设置最初的例外吗 作为库的内部异常 例外?

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

        2
  •  2
  •   TomTom    15 年前
    • 我让所有我认为用户可以处理的异常冒泡。这基本上是我认为他应该看到的东西(IO等)
    • 我用更抽象的方式包装所有要重新呈现的元素。在O/R映射器中,我有一个“dataaccessexception”,它在内部获得了任何SQL异常,因此用户不必处理它们的内部函数。这里的想法是,任何应用程序都可能希望知道发生了一个SQL级别的异常,但无论如何都无法尝试修复它(由于数据库是多种类型中的一种),所以包装器是好的。
    • 在调试之外,我从不使用通用的catch all。
    • 我总是有一个顶级的处理程序(AppDomain级别-未处理的异常事件)来尝试向用户显示发生了意外的异常并将其提交给支持人员。

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

        3
  •  0
  •   supercat    14 年前

    如果一个库包装了几个不同的类,这些类可能引发不同的异常,那么我不应该允许从内部到渗透出异常作为它们的原始类型。相反,它们应该包装在一个库特定的异常中,该异常尽可能清楚地与异常的原始类型相关。

    例如,magicdatabaselibrary可以定义magicdatabaseexception,它依次具有一些派生的异常magicdatabasetimeoutexception、magicdatabaseauthenticationexception等。如果SQL Server数据库引发SQL Server超时异常(无论它调用什么),则应该是wrappe在magicDatabaseTimeoutException中。同样,对于可能发生的任何其他半预期异常。

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

    推荐文章