我目前正在开展一个项目,而且我有点头疼。我已经用Java编程了大约两年,我已经涵盖了异常,但从未正确理解它们。
在我目前的情况下,我有一个初始化类的主要方法
WikiGraph wiki = wiki = new WikiGraph(getFile());
Wikigraph构造函数采用getFile()
方法中通过DialogBox获取的文件名。
wikigraph的构造函数然后调用一个名为loadfile(filename)
的方法,它试图加载和解析给定的文件。
loadfile()
方法是我将抛出IncorrectFileTypeError。
我的问题是,我应该在哪里处理这个问题?
目前我在loadfile()
方法
try {
//load file
} catch (IncorrectFileTypeError e){
System.out.println("Incorrect file type: "+filename+": "+e.getMessage());
throw new IncorrectFileTypeError();
}
但是我也在WikiGraph初始化中捕获它,如下所示:
while(wiki==null){ //While There is no valid file to add to the wikigraph
try {
wiki = new WikiGraph(getFile()); //Try to load file
} catch (IncorrectFileTypeError e) { //If file cannot be loaded
JOptionPane.showMessageDialog(null, "Incorrect File Type Given. Please Choose another file."); //Display error message
getFile(); //Prompt user for another file
}
}
现在是我以正确/最好的方式处理错误的方式吗?或者应该在其他地方处理,例如getFile()
方法?
答案 0 :(得分:4)
在这种情况下,我会避免使用异常作为处理不正确文件类型的主要方法。如果用户输入可以定期触发异常,则不应将其视为异常。这是我要采取的方法:
这种方法为您提供了两全其美的优势 - 您可以在提供无效数据时提醒用户,同时仍然从WikiGraphs的角度确保所提供的信息是准确的。它为开发人员提供了一种方法,可以确保他们的输入有效,而不需要异常处理。
答案 1 :(得分:3)
异常的一个主要好处是它们为您提供了方便的方法来处理远离它发生的异常。在不支持它的语言中,您必须在路径上进行每次调用,检查返回值,中断并返回,以便您手动传播。
处理您可以从中恢复或最佳报告并取消操作的异常是有意义的。
我的理解是,交互从UI输入开始,如果文件类型不合适,则无法真正恢复。因此,我将启动文件打开的任何UI任务捕获异常,向用户报告发生错误,并取消或要求不同的输入。
在第二次阅读时,您似乎在开始尝试创建图表后打开对话框。我个人喜欢隔离UI交互。因此,我个人首先处理所有UI输入,获取预期的文件名,验证它是否满足我的需求,如果没有,则向用户报告,如果文件正常,则仅继续,然后仅报告关键和意外错误。
答案 2 :(得分:1)
我觉得在loadfile
中抓住它是不合理的。您仍然可以编写日志消息(使用System.err
),只需在抛出异常之前执行此操作。你可以在正确的轨道上捕捉异常,你可以做一些事情(在这种情况下再次提示用户)。
答案 3 :(得分:1)
如果问题是用户选择了错误类型的文件,那么我认为你不应该让代码继续这么做。这看起来并不像它应该是一个Exception,而是程序中的更多路径。如果用户选择了不正确的文件类型,则应该向他显示再次选择文件的选择。显然,如果JFileChooser中的选项与查看扩展名一样简单,则应将其限制为正确类型的文件。
答案 4 :(得分:1)
我认为这是检查例外的情况类型(无论您是否同意这些情况。)我假设IncorrectFileTypeError
延伸Error
?扩展RuntimeException
会更合适,扩展IOException
会更好,因为这种错误可以通过有效的用户输入触发(即输入存在的文件名但类型错误。)
答案 5 :(得分:0)
我相信这种类型的错误(IncorrectFileTypeError)可以在用户输入表单中解决,避免不必要的往返文件系统服务层。