java - 正确抛出和捕获异常

标签 java exception

所以我有一个问题。假设我们有类:MainInfoCatsFood

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

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

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

最佳答案

一般来说,在方法内部,如果您可以在抛出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 () 的调用,并抛出更通用的异常(配置异常)。同样,此时,您无法对异常执行任何操作,除了将其包装在新的异常中,这会向引发的原始异常添加更多上下文信息。

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

关于java - 正确抛出和捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307410/

相关文章:

java - 无法发送邮件 - javax.mail.NoSuchProviderException : smtp

java - 将月份名称转换为日期范围

java - servlet [] 的异常 org.apache.catalina.core.ApplicationContext.log Servlet.init() 引发异常 java.lang.IllegalArgumentException

iphone - iphone 中的异常处理?

java - 在 Android 4.2 及更早版本中使用 PBKDF2WithHmacSHA1 和 DESede/CBC/PKCS5Padding

hashmap - Map.Entry 下一个方法?

c# - 构造函数重载异常

c++ - 在堆上分配异常有什么陷阱吗?

python - 打印 Python 异常的正确方法是什么?

arrays - F# Array.FindIndex 异常处理