Java异常处理获取控制台错误消息

时间:2014-10-13 09:11:24

标签: java exception-handling

我希望在生成异常时使用java获取错误消息。

现在我有以下场景的java代码:

method first(){

     try{
        second();
     }catch(Exception e){
        System.out.println("Error:> "+e)
     }

}

method second(){

     try{
       my code
     }catch(Exception e){
        throw new Exception("Exception generate in second method",e);
     }

}

现在当第一个方法执行时,我只得到“在第二个方法中生成异常”消息,但是在java上有一些其他消息在控制台上打印,所以如何获取该控制台错误消息。

注意:我已经尝试使用e.getMessage();和e.printStackTrace();

5 个答案:

答案 0 :(得分:1)

每个例外都有getCause()的原因。您可以递归地向下移动它们,直到找到根本原因。下面是一个使用实用程序的示例,该实用程序使用控制台执行的所有原因转储异常。

private void first() {
    try  {
        second();
    } catch (Exception ex) {
        Log.e("CATCH", getExceptionDump(ex));
    }
}

private void second() {
    try {
        throw new UnsupportedOperationException("We don't do this.");
    } catch (Exception ex) {
        throw new RuntimeException("Exception in second()", ex);
    }
}

private String getExceptionDump(Exception ex) {
    StringBuilder result = new StringBuilder();
    for (Throwable cause = ex; cause != null; cause = cause.getCause()) {
        if (result.length() > 0)
            result.append("Caused by: ");
        result.append(cause.getClass().getName());
        result.append(": ");
        result.append(cause.getMessage());
        result.append("\n");
        for (StackTraceElement element: cause.getStackTrace()) {
            result.append("\tat ");
            result.append(element.getMethodName());
            result.append("(");
            result.append(element.getFileName());
            result.append(":");
            result.append(element.getLineNumber());
            result.append(")\n");
        }
    }
    return result.toString();
}

答案 1 :(得分:0)

异常构造函数参数中的消息未打印在异常详细信息中。 您只需使用此代码即可打印消息:

method first(){

     try{
        second();
     }catch(Exception e){
        System.out.println("Error:> "+e.getMessage())
     }

}

希望这能解决您的问题

答案 2 :(得分:0)

为什么不能使用打印堆栈跟踪?

因为A throwable contains a snapshot of the execution stack of its thread at the time it was created.(请参阅Throwable

这意味着,如果你想打印堆栈跟踪,你需要在第二种方法中使用printStackTrace()方法BUT!

method second(){
  try {
    my code
  } catch(Exception e) {
    e.printStackTrace();
    throw new Exception("Exception generate in second method",e);
  }
 }

或使用棘手的方法setStackTrace并在第一个

中使用printStackTrace()
method second(){
  try {
    my code
  } catch(Exception e) {
    Exception ex = new Exception("Exception generate in second method",e);
    ex.setStackTrace(e);
    throw ex;
  }
 }

method first(){

 try {
   second();
 } catch(Exception e) {
    e.printStackTrace();
 }
}

答案 3 :(得分:0)

您可以打印您获得的例外原因。试试这个:

method first(){

     try{
        second();
     }catch(Exception e){
        System.out.println("Error:> "+e);
        if (e.getCause() != null) {
            System.out.println("Cause:> " + e.getCause());
        }
     }

}

答案 4 :(得分:0)

我相信这是您想要实现的控制台消息:

Error:> java.lang.Exception: Exception generate in second method

尝试此代码时,当第二个方法的catch块抛出异常时,第二个方法应该将其声明为throws或将一个嵌套的try catch放入catch块中。

异常传播到第一个()方法,该方法由其catch块处理。

 public class Test {

        public void first() {

            try {
                second();
            } catch (Exception e) {
                System.out.println("Error:> " + e);
            }

        }

        public void second() throws Exception {

            try {
                throw new Exception();
            } catch (Exception e) {
                throw new Exception("Exception generate in second method", e);
            }
        }

        public static void main(String ars[]) {

            Test test = new Test();

            test.first();

        }
    }