4

我有一个 Java 项目,它分为 3 个模块。这三个模块是独立的 Maven 项目,但它们之间存在依赖关系。关系很简单:

模块 A 依赖于模块 B

模块 B 依赖于模块 C

  • 模块 C 是一个处理低级数据库任务(如创建会话等)的库。
  • 模块 B 是一个数据库库,它定义了 DAO、DTO、实体等。
  • 模块 A 是一个 Restful Web 服务,它包含业务逻辑并使用库 B 访问数据库。

我在模块 C 中定义了一个已检查的异常,该异常由公共方法引发。模块 B 可以得到这个异常。

我的问题是,这对 B 来说是否是一个好习惯

  1. 捕获这个已检查异常并将模块 B 中本地定义的另一个已检查异常抛出到模块 A。
  2. 不捕获已检查的异常,而是在其公共方法中声明此异常,以便将其传递给模块 A。

我个人的观点是,一个模块应该只向它的客户端模块抛出一个它定义的检查异常,除非是 Java 的预定义异常。但是这肯定有一个缺点,这意味着我必须在多个模块中创建两个不同的异常来表示相同的错误条件。

任何人都可以分享您的意见吗?

4

2 回答 2

2

I would worry less about throwing exceptions and more about handling them.

Exceptions should be exceptional. They should be caught only when they are handled appropriately. If you can't handle, do nothing if it's an unchecked exception or catch and re-throw if it is.

Some modules should never, ever throw exceptions. I'm thinking of UI controllers, because a user has a bad experience if they see a stack trace. I'm also thinking of web services, because HTTP doesn't know or care about your exceptions.

Your error handling strategy should not revolve around exceptions. You can send codes between modules and have a contract for handling them.

Logging is not handling.

I couldn't advise you on what do to based on what you've posted. I'd want to know more about what the modules are doing.

于 2013-09-01T14:29:40.023 回答
2

我从类型耦合的角度来看这个。如果模块 B 完全封装了模块 A 中模块 C 中的类型,那么绝对不要仅仅为了例外而在 A 和 C 之间引入类型耦合。如果模块 B 已经向 A 公开了 C 的类型(即 A 直接依赖于 C 以及通过它对 B 的依赖),那么继续抛出 C 的异常。

于 2013-09-01T14:33:57.050 回答