为什么存储库模式的示例永远不会处理数据库连接异常?

BCA*_*BCA 6 architecture exception-handling repository-pattern

我已经阅读了很多教程,并看到了很多关于Repository模式实现的代码示例.几乎在每种情况下,都不会解决因数据库不可用时尝试访问数据库而导致的异常.考虑到如果数据库位于网络上的某个位置,这是一个非常现实的情况,这似乎很奇怪.

那么处理这些异常的最佳做法是什么?

  • 在try/catch中包含这100个调用中的每一个,其中每个调用可能具有相同的n个 catch块?这有很多重复,杂乱,容易出错等.

  • 让异常泡到应用程序级别会将它们作为未处理的异常捕获吗?如果在UI线程上抛出异常,这是有意义的,否则,处理未处理的AppDomain异常会导致应用程序关闭.

  • 使用Enterprise Library的异常处理应用程序块等框架?

小智 3

老实说,我认为这个问题没有得到解决,因为关于如何处理异常的持续(和情绪化)争论。关于异常是否应该在本地处理(这样有更大的机会理解它们并做一些明智的事情,比如重试)或在 UI 层处理(99.9% 的异常最终会冒泡到),一直存在着反复的争论。

就我个人而言,我发现在存储库层中执行 try/catch 来捕获特定于数据库的异常,并抛出我自己创建的新异常是最优雅的。这给了我一个放置重试逻辑的地方。然后我还可以决定 DAOException 是检查异常还是运行时异常。

这允许用户界面处理已知的异常,并帮助我将更高级别的层与任何特定于提供程序的错误隔离开来。例如,如果我将数据存储迁移到 Mongo 或 Cassandra 等 No-SQL 数据库,我仍然可以抛出相同的异常,并保持其语义,而无需更改所有调用代码。