将抛出的异常写入文件

时间:2012-01-30 22:22:13

标签: java exception exception-handling throws

是否可以在不使用try catch块的情况下将抛出的异常写入文件?

例如

public static void method() throws Exception, SQLException{
    if(Exception is thrown){
        write Exception to out.txt;
        write SQLException to out.txt;
    }
}

或者您必须这样做:

public static void method(){
    try{
        ...
    }catch(Exception ex){
        write ex to file;
    }catch(SQLException sqlex){
        write sqlex to file;
    }
}

7 个答案:

答案 0 :(得分:1)

在Java中,我不会认为它是可能的。

但是,如果在* nix上执行,则只能redirect all output to a file(或只是错误输出)。但这不是一般的解决方案。

答案 1 :(得分:1)

你必须catch那个例外。如果你抓住它,后来决定写一个文件就可以了。鉴于你有上面的内容,我建议采用第二种方式,因为if语句无法实际获得异常。

答案 2 :(得分:1)

捕获方法中特定错误的唯一方法是使用Try / Catch块。但是,有一个类可以捕获所有未捕获的异常 - 即任何没有Try / Catch的异常。

您可以编写自定义类来实现Java的UncaughtExceptionHandler接口。

import java.lang.Thread.UncaughtExceptionHandler;

public class CustomUncaughtExceptionHandler implements UncaughtExceptionHandler {
  public void uncaughtException(Thread thread, Throwable throwable) {
    /* Write to file here */
  }
}

然后,您需要告诉Java虚拟机将未捕获的异常重定向到您的类。

public static void main(String[] args){
  Thread.setDefaultUncaughtExceptionHandler(new CustomUncaughtExceptionHandler());
}

答案 3 :(得分:1)

除非你检测字节代码(你可以使用代理和asm之类的东西),否则你无法使用直接java。您可以使用方面执行此操作,这比字节代码检测方法更容易。以aspectj为例。一个方面可能是:

public aspect ExceptionAdvice {

    pointcut allMethods() : execution(* *(..)) && !within(com.test.ExceptionAdvice);

    after() throwing(Exception e) : allMethods() {
        //write to a file or whatever - I'm lazy and just printed the stack
        e.printStackTrace ();
    }
}

将此编织到应用程序类后,抛出的所有异常都将通过此处的连接点传递。我只是打印堆栈,但您可以将其记录到文件或做任何你想做的事情。当连接点完成时,将继续抛出异常,因此调用代码有机会处理它。显然,您需要更改切入点定义以适合您的类,但这是一般的想法。

答案 4 :(得分:0)

没有

public static void method() throws Exception, SQLException{
    if(Exception is thrown){
        write Exception to out.txt;
        write SQLException to out.txt;
    }
}

异常来自哪里?

顺便说一句:你永远不会声明要抛出最抽象的异常Exception。一些RuntimeExceptions几乎可以在任何地方出现(Nullpointer,OutOfMemory),所以在任何地方声明它们都没用。这只是噪音。

public static void method() throws Exception, SQLException{
    try{
        ...
    }catch(Exception ex){
        write ex to file;
    }catch(SQLException sqlex){
        write sqlex to file;
    }
}

但是如果你抓住它,你通常不会抛出,因此根本不会声明抛出异常。

答案 5 :(得分:0)

在第二个块中,您已经捕获了异常,因此不需要抛出异常,SqlException。

在常规代码行上检测到异常,因此您无法为每个代码添加if。是的,try / catch(写)是唯一的方法。

除非......你使用if / else而不是异常处理

答案 6 :(得分:0)

您需要捕获异常并重新抛出它。

public static void method() throws Exception, SQLException{
    try{
        ...
    }
    catch(SQLException sqlex){
        write sqlex to file;
        throw ex;
    } 
    catch(Exception ex){
        write ex to file;
        throw ex;
    }
}