我正在尝试为Java中的MVC应用程序找出一个有效的异常处理方法。在我的编程类中,我学会了为我的所有类编写一个额外的异常(图的右侧)但是这在大型应用程序中耗尽,因为你在各处都有许多不同的异常类和try-catch语句(这违反了'throw)在我看来,早期,赶上'原则'所以我试图将此approach应用于我的申请。
我的问题是下面显示的解决方案(图中的左侧部分)是否是一种有效的方法,或者是否有任何障碍我可以在以后运行?是否甚至赞同在模型的较低级别包装发生的异常并将其交给控制器不变或者仅在模型的顶层捕获所有发生的异常?
我发现这方面的信息很少,所以我希望你能给我一些意见,最重要的一些批评。提前谢谢!
更新1:
这里的Model
类主要由
public class Model {
private MyData someData;
//some more data
public String parseFile(file) {
return Parser.parse(file);
}
public Result analyzeData(someData) {
return Analyzer.analyze(someData);
}
//...
}
所以它拥有一些数据结构,但主要是调用“服务”类(?)的方法,如FileReader
,Analyzer
或Parser
。这些类都抛出Exceptions
之类的IOException
等,控制器应该知道我希望用户被告知的重要类。
在我看来,实际的Model
类(不真正处理数据)必须不知道“服务”类中发生的异常。它应该只是交给能够处理它们并决定做什么的控制器。
因此,我的想法是将已发生的异常包装起来,这样Model
类就不用担心了。
答案 0 :(得分:1)
我在这里缺少的是服务。通常,当您拥有瘦身模型时,您的服务正在进行繁重的工作。但是,当你有一个厚模型时,可以在没有服务的情况下进行...有点。
尽管如此,你的问题是关于exeptions。首先,你在这里谈论Java,那么它们是否是Checked例外? 如果您认为函数的用户无法合理地处理它们,则大多数异常应该是未经检查的异常。您不希望给对象的用户带来各种各样的边缘情况,他无法采取适当的操作。
记住这一点,它会留下很多运行时间。您的控制器需要决定在发生某些runtimexceptions时要执行的操作。它可能只是显示不同的错误页面,或者可能从异常中了解一点。你的控制器在那里有一个异常处理程序是好的。
至于包装异常,这应该只有在你有一个实际的分层应用程序时才能完成。例如,如果您有视图层,业务层和持久层(按此顺序),则持久层应仅提供自己的异常。任何底层技术都应该被屏蔽(尽管如果它是一个无法处理的的例外,那么让它泄漏可能就好了)。同样,对于业务层,它绝对不应该向视图层显示持久层异常。
根据您的期望或期望,可能是您的持久层具有catch RuntimeException(e) {throw new PersistanceRuntimeException(e);}
类似的结构,但实际上,您可能不希望任何用户成功处理此类异常,因此可能没问题让那个泄漏(并让它在你的控制器的catch RuntimeException(e) {showErrorPage();}
)