在java中使用每个方法的大尝试捕获是否是一种已知的好做法?[已关闭]

2022-08-31 15:52:03

我最近接受了面试,面试官希望我做一个技术测试,看看我的知识。在我完成之后,他给了我关于我是如何做到的反馈,这是我没想到的,我很感激,因为很少有面试官不想雇用你。

他告诉我,他看到我的代码不好的一件事是,我在我写的每个方法中使用了不止一个 try-catch 块。这引起了我的注意,因为我认为它很有趣。

目前,我认为我应该制作 try-catch 块,其中有一个语义上可区分的代码块,该代码块具有一个或多个可以引发需要捕获的异常的方法。我遵循的唯一例外是,如果两个方法引发相同的异常类型,我最好将它们放在不同的 try-catch 块中,以便在调试时清楚地区分在何处以及为什么引发异常。

这与面试官希望我做的事情截然不同。那么,每种方法只使用一个 try-catch 块是一种已知的良好做法吗?如果这是一个已知的良好做法,这样做有什么好处?


请注意,我想知道这是否是一个已知的良好做法。也就是说,如果大多数程序员/作者都同意这是一个很好的做法。


答案 1

对我来说,两个尝试捕获块使大多数方法太长。如果该方法正在做很多事情,它会混淆意图。

通过两个尝试捕获块,它至少做了四件事,确切地说

  • 两个主流案例(两个 try 块)
  • 两种错误处理情况(捕获块)

我宁愿从每个尝试捕获块中制作简短明了的方法 - 就像

private String getHostNameFromConfigFile(String configFile, String defaultHostName) {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(configFile));
        return reader.readLine();
    } catch (IOException e) {
        return defaultHostName;
    }
}
public Collection<String> readServerHostnames(File mainServerConfigFile, File  backupServerConfigFile) {
    String mainServerHostname=getHostNameFromConfigFile(mainServerConfigFile,"default- server.example.org");
    String backupServerHostName=getHostNameFromConfigFile(backupServerConfigFile,"default- server.example.ru")
    return Arrays.asList(mainServerHostname,backupServerHostName);
}

Robert C. Martin在“Clean Code”中将其提升到一个新的水平,并建议:

如果关键字“try”存在于函数中,它应该是函数中的第一个单词,并且在捕获/最终阻止之后应该没有任何内容。

我肯定会用两个单独的 try/catch 块将方法重构为更小的方法。


答案 2

我想说的是,如果你发现自己用两个单独的代码块包装,你应该考虑将这些块重构为单独的方法。如果这是你在面试中使用的模式,那么你可能误解了面试官。try/catch

如果算法需要,使用两个块是完全可以的。我经常在 catch 块中使用新的来确保安全清理,因此不可能进行一揽子声明。try/catchtry/catch