所以我有一个问题。假设我们有类:Main
、Info
、Cats
、Food
现在,假设我们在 main 中创建新对象 Info
。在 Info
对象中,我们保存已创建的 Cats
列表。 Cats
正在创建并存储在 Info
类中,Food
正在创建并存储在 Cats
类中。现在可以说,在 Main
类中,我想获取特定的 Food
对象,该对象存储在 Cats
类中。因此,为了做到这一点,我们执行以下操作:
Info.getFood(名称)
。然后在 Info 的
getFood
方法中我们说 Cats.getFood(name)
。最后,在 Cats
类中,我们有方法 getFood
,在该方法中我们尝试通过字段“name”查找 Food 对象。如果我们无法找到这样的元素,我们会抛出 NoSuchElement
异常,而不是返回一个对象。这是我的问题:
如果我们在 Cats
类 getFood
方法中抛出异常,我们是否应该在 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/