Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序中的异常处理_Java_Exception - Fatal编程技术网

Java应用程序中的异常处理

Java应用程序中的异常处理,java,exception,Java,Exception,当我从处理数据库的包中抛出异常时,在处理UI的包中,我应该抛出相同的异常还是创建另一个异常 UI包应该知道我处理数据库的包的异常情况?作为程序员,我们希望编写解决问题的高质量代码。不幸的是,异常是代码的副作用。没有人喜欢副作用,所以我们很快就会找到自己的方法来克服它们。我见过一些聪明的程序员通过以下方式处理异常: public void consumeAndForgetAllExceptions(){ try { ...some code that throws exce

当我从处理数据库的包中抛出异常时,在处理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,但我已经习惯了,而且可以正常工作。”


请访问以了解更多详细信息。

为了保持各层紧密耦合,我建议抽象您的
异常(如果没有合适的标准异常)。使用abstract,我的意思是您可以将依赖数据库的异常(如
SQLException
)包装成
PersistenceException
或类似的东西。通过这种方式,您可以轻松地更改图层,而不必担心更改上面图层的代码。 然后,如果您可以处理异常,您应该只捕获并处理异常,例如,将异常传播给GUI中的用户。否则,您应该将它们扔给下一个调用方,直到它在更高级别上得到处理。
您应该避免在出现新异常时重新创建新异常,这在大多数情况下不会添加任何信息。

您应该抛出一个有意义的异常。更重要的是,你不应该抛出一个异常。异常表示您无法轻松从中恢复的错误状态,这意味着如果您有代码来处理丢失的文件之类的事情,它不应该抛出异常。只有在发生意外情况时才应引发异常

当异常通过堆栈向上传播时,它们应该是多样化的,这取决于它们捕获到的代码的哪一部分


例如,您的持久性框架可能会抛出SqlException,您的DAO层可能会将其作为IllegalArgumentExection或ObjectNotFoundEception重新抛出,您的服务层可能会抛出格式错误的dRequestException、AccessDeniedException或DeviceNotRolledException。最后,您的UI可能会以多种有意义的方式向用户显示这些异常。

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

在有意义的地方使用预定义的异常,您也可以创建自己的异常,并在需要时将它们放在两个包中

对其进行设计,使代码的处理方式使catch语句在逻辑上易于定位,catch语句处理代码,并在向上传递层次结构后进行某种恢复


我们最关心的情况类型是检查异常。这些都是我们可以预见、发现并试图恢复的问题。确保你没有使用太多这些!他们是昂贵的资源

下面是关于处理异常的最佳实践的讨论: