繁体   English   中英

在Java应用程序中处理异常

[英]Handling exceptions in Java application

在处理数据库的程序包中引发异常时,在处理UI的程序包中引发异常时,应该抛出相同的异常还是创建另一个异常?

UI程序包应该知道我处理数据库的程序包的异常吗?

作为程序员,我们希望编写解决问题的高质量代码。 不幸的是,异常是我们代码的副作用。 没有人喜欢副作用,因此我们很快找到了解决它们的自己的方法。 我已经看到一些聪明的程序员通过以下方式处理异常:

public void consumeAndForgetAllExceptions(){
    try {
        ...some code that throws exceptions
    } catch (Exception ex){
        ex.printStacktrace();
    }
}

上面的代码有什么问题?

引发异常后,将暂停正常程序执行,并将控制权转移到catch块。 catch块捕获异常并抑制它。 在catch块之后继续执行程序,好像什么也没发生。

接下来呢?

 public void someMethod() throws Exception{
 }

这种方法是空白的。 它没有任何代码。 空白方法如何引发异常? Java不会阻止您执行此操作。 最近,我遇到了类似的代码,在该代码中声明了该方法引发异常,但是实际上没有代码生成该异常。 当我问程序员时,他回答说:“我知道,它正在破坏API,但是我已经习惯了它并且可以工作。”

请访问这里了解更多详情。

为了使各层紧密耦合,我建议对Exception进行抽象(如果没有合适的标准异常)。 抽象是指您可以将与数据库相关的异常(如SQLException包装到PersistenceException或sth中。 像那样。 这样,您可以轻松更改图层,而不必担心更改以上图层的代码。 然后,仅应在可以处理异常的情况下捕获并处理异常,例如,将异常传播到GUI中的用户。 否则,您应该将它们扔给下一个呼叫者,直到更高级别处理它为止。 您应该避免在重新创建新异常时重新创建它们,在大多数情况下,这些新异常不会添加任何信息。

您应该抛出一个有意义的异常。 更重要的是,您不应引发没有异常的异常。 异常表示您无法轻易恢复的错误状态,这意味着,如果您具有处理丢失文件之类的代码,则不应抛出异常。 仅应在发生意外情况时引发异常。

当异常在您的堆栈中传播时,应根据捕获的代码的哪一部分对其进行多样化。

例如,您的持久性框架可能会抛出SqlException,DAO层可能会将其重新抛出为IllegalArgumentExection或ObjectNotFoundEception,服务层可能会抛出MalformedRequestException,AccessDeniedException或DeviceNotEnrolledException。 最后,您的UI可以以多种有意义的方式向用户显示此内容。

我建议将异常放在最相关的位置。 您应该在不同类型的情况下使用不同的异常来处理代码。 UI将具有与数据库不同的异常类型。

在可能的情况下使用预定义的异常,您也可以创建自己的异常,并在需要时将其放入两个程序包中。

对代码进行设计,以便可以以一种易于在逻辑上定位catch语句的方式来处理代码,并且catch语句可以处理该代码,并且可以在传递到层次结构后进行某种恢复。

我们最关心的情况类型是检查异常。 这些是我们可以预见并捕获并试图恢复的问题。 确保您没有使用太多这些! 它们浪费资源!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM