首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >您是为特定的问题或一般的例外写例外?

您是为特定的问题或一般的例外写例外?
EN

Stack Overflow用户
提问于 2008-08-22 02:47:44
回答 11查看 1.3K关注 0票数 10

我有一些代码,给一个用户id的实用程序,然后发送电子邮件给该用户。

代码语言:javascript
代码运行次数:0
运行
复制
emailUtil.sendEmail(userId, "foo");

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

引发MailException的原因有很多,包括电子邮件地址的问题、邮件模板的问题等等。

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

编辑:作为一种澄清,异常不是针对日志的,而不是,这与代码对它们的反应有关。为了继续使用邮件示例,假设当我们发送邮件时,它可能会失败,因为您没有电子邮件地址,或者因为您没有有效的电子邮件地址,或者它可能失败。等。

我的代码希望对每一个问题都有不同的反应(主要是通过更改返回给客户端的消息,但也改变实际的逻辑)。

对于这些问题中的每一个,最好都有一个异常实现,或者一个总括的异常,它的内部(一个枚举)可以让代码区分它是什么类型的问题。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-09-26 09:55:04

我通常从一般异常开始,并根据需要对它进行子类处理。如果需要,我总是可以捕获一般异常(以及所有子类异常),但也可以捕获特定的异常。

Java的一个例子是IOException,它有像FileNotFoundException或EOFException这样的子类(还有更多的)。

这样你就可以得到两者的优势,你就没有抛出条款,比如:

代码语言:javascript
代码运行次数:0
运行
复制
throws SpecificException1, SpecificException2, SpecificException3 ...

将军

代码语言:javascript
代码运行次数:0
运行
复制
throws GeneralException

就够了。但是,如果你想对特殊的情况有特殊的反应,你总是可以抓住具体的例外。

票数 8
EN

Stack Overflow用户

发布于 2008-08-22 03:07:02

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

有时,我确实想捕获一个特定的异常(就像您似乎想要的那样)。然而,您可能会发现,这有点罕见,而且它指示使用异常来控制逻辑--这种逻辑效率很低(慢),而且经常被人不悦。

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

公共bool isEmailConfigured()

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

当异常确实发生时,这实际上意味着这种情况是完全出乎意料的,而代码无法处理它--所以最好的方法是向用户报告它(或者将它写入日志或重新启动)。

至于有异常等级和有错误代码的异常,我通常是这样做的。如果您只需要定义一个新的错误常量,而不是一个全新的类,那么添加新的异常就更容易了。但是,只要你试图在整个项目中保持一致,这就无关紧要了。

票数 10
EN

Stack Overflow用户

发布于 2008-08-22 04:46:00

@Chris.Lively

您知道,您可以在异常中传递消息,甚至可以传递“状态代码”。你在这里重新发明方向盘。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档