1

是否可以在不使用 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;
    }
}
4

7 回答 7

1

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

但是,如果在 *nix 上执行,您可以将所有输出重定向到文件(或只是错误输出)。但这不是一个通用的解决方案。

于 2012-01-30T22:26:08.700 回答
1

您必须以catch某种方式解决该异常。如果你抓住它,然后决定写一个文件就可以了。鉴于您上面的内容,我建议使用第二种方法,因为 if 语句无法实际获取异常。

于 2012-01-30T22:26:50.343 回答
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());
}
于 2012-01-30T22:32:40.487 回答
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 ();
    }
}

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

于 2012-01-30T22:51:57.173 回答
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;
    }
}

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

于 2012-01-30T22:27:52.853 回答
0

在第二个块中你已经捕获了异常,所以不需要抛出异常,SqlException。

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

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

于 2012-01-30T22:28:43.913 回答
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;
    }
}
于 2012-01-30T22:29:08.323 回答