【问题标题】:Throwing and catching exceptions correctly正确抛出和捕获异常
【发布时间】:2014-03-10 17:42:38
【问题描述】:

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

现在,假设我们在 main 中创建了新对象 Info。在Info 对象中,我们正在保存已创建的Cats 列表。 Cats 正在创建并存储在 Info 类中,Food 正在创建并存储在 Cats 类中。现在可以说,在Main 类中,我想获取特定的Food 对象,该对象存储在Cats 类中。因此,为了做到这一点,我们执行以下操作:

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

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

【问题讨论】:

  • 你能用mock code代替文字吗?
  • 在知道如何处理它的上下文中捕获异常。

标签: java exception exception-handling


【解决方案1】:

一般来说,在方法内部,如果您可以对抛出的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 () 中,您可以用try/catch 包围对readConfigurationFromFile () 的调用,并抛出更通用的异常(ConfigurationException)。同样,此时,您无法对异常执行任何操作,只能将其包装在一个新异常中,该异常会为引发的原始异常添加更多上下文信息。

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

【讨论】:

  • 但是您应该在所有方法中捕获它,还是只在“主要”方法中捕获它?方法的层次结构:getFood() -> getFood2() -> okGetFood()(我们在这里抛出异常)。那么在哪里捕获它:在 getFood 或 getFood2 中,或两者兼而有之?
  • 你不能在“所有”它们中捕获它,除非你在捕获它之后重新抛出异常。
  • @user3178137 您需要回答的问题是“我可以在这个级别上对这个异常做些什么吗?”。例如,如果您无法在getFood2() 中做出任何决定,但您可以决定在getFood() 中显示错误消息,然后在getFood() 中捕获它。
【解决方案2】:

以下网站说“大多数开发人员在必须在两个选项之间进行选择时感到尴尬。这种类型的决定不应该在开发时做出。如果您是开发团队,应该在所有开发人员之间进行讨论开发人员以便有一个通用的异常处理策略。”

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

【讨论】:

  • 既然是个人物,就不用跟团队谈这个了。我正在尝试找出哪种方式更好。
  • 我不知道一种方式是否比另一种方式“更好”。这取决于。
【解决方案3】:

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

举例来说,如果您只想从任何猫返回任何食物对象(并且正如您所说的“信息”存储很多猫),那么您可能会在 Info 中捕获 NoSuchElement 异常,然后创建一些逻辑可以转移到 Info 中的下一只 Cat 以获得它的食物!最后,如果你用尽了 Info 中的所有“Cats”,但没有找到食物,你可以在 Main 中捕获的 Info 中抛出另一个异常,让 main 知道“没有食物”。

这只是一个例子。正如人们所说,这不是“总是这样做......”的答案。这在很大程度上取决于您在处理该异常

需要做什么

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 2011-07-28
    • 2013-05-07
    • 2018-03-09
    • 2013-01-28
    • 1970-01-01
    • 2019-12-28
    • 2016-08-24
    • 2016-02-17
    相关资源
    最近更新 更多