所以我有这个问题。假设我们有课程:Main
,Info
,Cats
,Food
现在,让我们说主要创建新对象Info
。在Info
对象中,我们保存已创建的Cats
列表。正在创建Cats
并将其存储在Info
类中,正在创建Food
Cats
类。现在让我们说,在Main
类中,我希望获得特定的Food
对象,该对象存储在Cats
类中。因此,为此,我们执行以下操作:
Info.getFood(name)
。然后在Info's
getFood
方法中我们说Cats.getFood(name)
。最后,在Cats
类中,我们有方法getFood
,我们尝试通过其字段“name”查找Food对象。如果我们无法找到这样的元素,我们抛出NoSuchElement
异常而不是返回一个对象。这是我的问题:
如果我们在Cats
类getFood
方法中抛出异常,我们是否应该在Main
类(我们的接口所在)中捕获该异常,在Info
类中(这是我们的系统类)或两者都有?
答案 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中找到主要知道“没有食物”。
再一次,这只是一个例子。正如人们所说,这不是一个“总是这样......”的答案。在处理异常
时,它在很大程度上取决于您需要要做什么