当前位置:  开发笔记 > 编程语言 > 正文

您是否针对特定问题或一般例外编写例外情况?

如何解决《您是否针对特定问题或一般例外编写例外情况?》经验,为你挑选了2个好方法。

我有一些代码为用户提供用户ID,然后向该用户发送电子邮件.

emailUtil.sendEmail(userId, "foo");

public void sendEmail(String userId, String message) throws MailException {
    /* ... logic that could throw a MailException */
}

MailException 可能会因为多种原因而抛出,电子邮件地址出现问题,邮件模板出现问题等.

我的问题是这样的:你是为这些异常中的每一个创建一个新的异常类型然后单独处理它们还是创建一个MailException然后将一些东西存储在允许的异常(计算机可读的东西,而不是描述文本)中我们根据实际发生的事情做不同的事情.

编辑:作为澄清,例外不是日志和什么不是,这与代码如何对它们做出反应有关.为了继续使用邮件示例,让我们说当我们发送邮件时,它可能会因为您没有电子邮件地址而失败,或者因为您没有有效的电子邮件地址,或者它可能会失败等等.

我的代码希望对每个问题做出不同的反应(主要是通过更改返回给客户端的消息,但也包括实际逻辑).

最好是针对这些问题中的每一个进行异常实现,或者是一个具有内部特征的一个伞状异常(一个枚举说),让代码区分它是什么类型的问题.



1> jm...:

在我的代码中,我发现MOST异常渗透到UI层,在那里它们被我的异常处理程序捕获,它只是向用户显示消息(并写入日志).毕竟,这是一个意想不到的例外.

有时,我确实希望捕获一个特定的异常(正如您似乎想要做的那样).但是,您可能会发现这种情况有点罕见,并且它表明使用异常来控制逻辑 - 效率低(慢)且经常不赞成.

因此,使用您的示例,如果您想在未配置电子邮件服务器时运行某些特殊逻辑,您可能需要向emailUtil对象添加一个方法,如:

public bool isEmailConfigured()

...首先调用它,而不是寻找特定的异常.

当发生异常时,它实际上意味着情况完全出乎意料并且代码无法处理它 - 因此您可以做的最好的事情是将其报告给用户(或将其写入日志或重新启动)

至于具有异常层次结构与其中的异常错误代码,我通常会执行后者.如果您只需要定义新的错误常量而不是全新的类,则更容易添加新的异常.但是,只要您尝试在整个项目中保持一致,这并不重要.



2> Mnementh..:

我通常从一般异常开始,并根据需要对其进行子类化.如果需要,我总是可以捕获一般异常(以及所有子类异常),但也具体.

Java-API的一个示例是IOException,它具有类似FileNotFoundException或EOFException(以及更多)的子类.

这样你就可以获得两者的优点,你没有像以下那样的throw-clauses:

throws SpecificException1, SpecificException2, SpecificException3 ...

将军

throws GeneralException

足够.但是,如果您想对特殊情况做出特殊反应,您可以随时捕获特定的异常.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有