繁体   English   中英

如何在此代码中管理异常?

[英]How to manage exceptions in this code?

我想知道为什么我不能在下面的嵌套catch中使用throw,但出现错误。 在这种情况下,如何很好地处理异常?

try {
    /* some code which can throw DataAccessException */
    try {
        /* some code which can throw FileNotFoundException */
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }       
} catch (DataAccessException e) {
    e.printStackTrace();
    throw e;
}

另一个例子,我不确定我是否能很好地处理异常。 我不确定要打印堆栈跟踪信息,这是一个好习惯吗?

public class SomeCode {

    public static void main(String[] args) {
        A a = new A();
        a.method1();
    }
}

class A {

    B b = new B();

    public void method1() {

        log.info("I'm gonna call method 2");
        try{
            b.method2();
            log.info("success");
        }
        catch(Exception e) {
            log.info("failure");        
        }
    }
}

class B {

    C c = new C();

    public void method2() {
        log.info("I'm method 2 and I'm gonna call method 3");
        try{
            c.method3();
            log.info("success");
        }
        catch(Exception e) {
            throw e;        
        }
    }
}

class C {

    public void method3() {
        log.info("I'm method 3!");
        try{
            log.info("woo-hoo!");
            /*
                some code which can throw DataAccessException.
            */
        }
        catch(DataAccessException e) {
            e.printStackTrace();
            throw e;
        }
    }
}

任何有关如何更好地处理异常的建议将不胜感激。

捕获异常完全取决于用例,现在让我们看看它的含义:

  1. 如果您只是不希望代码中断,或者用户不希望代码中断。

     try { // Some code } catch( Exception e){ // Log the exception or print trace, so that you can understand that later. return <Something> // Depends on the function } 

或者,您可能想以不同的方式处理每种情况,例如,假设该函数是要向用户解释发生了什么:

    try {
        // Some code 
    } catch( FileNotFoundException e){
        return “File was not found, try other file”;
    } catch( Exception e){
        Log(“There was an error”);
        return “ Something didn’t go as expected ,              please try later”;
    }

或者您可以使用自己的异常类,

    try {
        // Some code
    } catch (Exception e){
        throw new PersonalProjectException();
    }

只是我的两分钱。 在第二个示例中,您不需要在类B上使用try / catch块,因为您只是抛出异常。 我将其重写为以下内容:

class B {

    C c = new C();

    public void method2() throws Exception {
        log.info("I'm method 2 and I'm gonna call method 3");
        c.method3();
        log.info("success");            
    }
}

打印堆栈跟踪信息可以帮助开发人员了解正在发生的情况,但是在您的示例中,您忽略了打印后的异常。

我个人试图避免传播异常。 如果系统无法处理它并恢复,我更喜欢在捕获一个已检查的异常并清除任何资源后抛出一个异常异常。

如果有机会,请参阅“ 清洁代码”书的第7章。 它涵盖了错误处理,非常有用。

如果没有更好的解释您收到的特定错误,将很难回答问题的第一部分。 但是,如下面的代码所示,嵌套异常没有任何问题:

public static class DataAccessException extends Exception
{
}



public static void daeMethod() throws DataAccessException
{
}



public static void fneMethod() throws FileNotFoundException
{
}


// this method compiles and executes fine, throwing a DataAccessException
// but catching an ignoring a FileNotFoundException
public static void compoundMethod() throws DataAccessException
{
    try {
        daeMethod();
        try {
            fneMethod();
        }
        catch (FileNotFoundException e) {
        }
    }
    catch (DataAccessException e) {
        throw e;
    }
}

根据评论,添加一个示例,其中我可能不在乎异常。 假设我正在尝试解析潜在的配置设置。

double d = 2.5; //my default
String s = configuration.getCfg(SomeParameter);
try {
  d = Double.parseDouble(s);
}
catch (NumberFormatException whoCares) {
  //just ignore it; use the default
}

在这种情况下, 除非存在有效的条目, 否则我将使用默认值。 我可以通知用户未找到任何设置,或者发现了错误的设置,等等。 但是,我可能不在乎。 除非文件中有特定的有效值,否则默认设置有效。

嵌套异常的正确方法如下所示:

try {
   /* some code which can throw some Exception*/
}catch (FileNotFoundException e) {
   e.printStackTrace();
}catch (DataAccessException e) {
   e.printStackTrace();
   throw e;
}catch(Exception e){
   e.printStackTrace();
   throw e;
}

如果代码根据类型抛出异常,则输入相应的catch。

问候!

暂无
暂无

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

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