正确地抛出和捕获异常

时间:2014-03-10 17:42:39

标签: java exception exception-handling

所以我有这个问题。假设我们有课程:MainInfoCatsFood

现在,让我们说主要创建新对象Info。在Info对象中,我们保存已创建的Cats列表。正在创建Cats并将其存储在Info类中,正在创建Food Cats类。现在让我们说,在Main类中,我希望获得特定的Food对象,该对象存储在Cats类中。因此,为此,我们执行以下操作:

Info.getFood(name)。然后在Info's getFood方法中我们说Cats.getFood(name)。最后,在Cats类中,我们有方法getFood,我们尝试通过其字段“name”查找Food对象。如果我们无法找到这样的元素,我们抛出NoSuchElement异常而不是返回一个对象。这是我的问题:

如果我们在CatsgetFood方法中抛出异常,我们是否应该在Main类(我们的接口所在)中捕获该异常,在Info类中(这是我们的系统类)或两者都有?

3 个答案:

答案 0 :(得分:2)

一般来说,在一个方法中,如果你可以对抛出Exception做一些事情(记录错误,显示错误信息,在代码中做出不同的决定等),那么你应该抓住它。否则,只需将其抛给调用方法。

与许多其他编码实践一样,这一切都归结为您和您的团队的共识。

一个与您的代码无关的具体示例,但它将向您展示如何制定决策流程。假设以下代码:

public MyConfiguration loadConfiguration () throws ConfigurationException {
    MyConfiguration config = null;

    try {
        readConfigurationFromFile ();

        // Parse configuration string

    } catch (IOException ioex) {
        throw new ConfigurationException (ioex);
    }

    return config;
}

private String readConfigurationFromFile () throws IOException {
    String configuration = "";

    // Read a file on disk, append data to the string.

    return configuration;
}

readConfigurationFromFile ()中,如果在阅读文件时发生异常,您将获得IOException。在代码的这一点上,您无法采取任何实际操作,因为此方法仅读取配置文件,将数据附加到String,然后返回。

loadConfiguration ()中,您可以使用readConfigurationFromFile ()try/catch的呼叫包围,并抛出更通用的异常(ConfigurationException)。同样,在这一点上,除了将它包装在一个新的异常中,除了将更多的上下文信息添加到抛出的原始异常之外,你无法对异常做任何事情。

现在假设您的软件有两种版本:GUI版本和命令行版本。如果您正在运行GUI风格,那么调用loadConfiguration的方法可能决定在抛出ConfigurationException时向用户显示错误消息,以便用户知道发生了什么。如果您正在运行命令行版本,那么将一个条目添加到某个错误日志中可能更合乎逻辑,但会捕获该异常。

答案 1 :(得分:0)

以下网站说"大多数开发人员在必须在两个选项之间进行选择时会感到尴尬。不应在开发时采取此类决定。如果您是开发团队,应该在所有开发人员之间讨论,以便有一个共同的异常处理策略。"

http://en.wikibooks.org/wiki/Java_Programming/Throwing_and_Catching_Exceptions

答案 2 :(得分:0)

在抛出异常后,这很大程度上取决于你想要做什么。

比如说,如果你想要的只是从任何猫中返回任何食物对象(正如你所说'信息'存储了很多猫)那么你可能在Info中有一个捕获,你捕获NoSuchElement异常,然后创建一些逻辑移动到信息中的下一个Cat来获取它的食物!最后,如果您在Info中没有找到任何食物的情况下耗尽所有'Cats',您可以在Info中捕获另一个异常,您可以在Main中找到主要知道“没有食物”。

再一次,这只是一个例子。正如人们所说,这不是一个“总是这样......”的答案。在处理异常

时,它在很大程度上取决于您需要要做什么