2012-01-30 123 views
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; 
    } 
} 

回答

0

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

哪里异常从何而来?

btw .:你永远不会声明要抛出的最抽象的异常Exception。某些RuntimeException几乎可以在任何地方发生(Nullpointer,OutOfMemory),因此无处可以将它们声明为无用的。这只是噪音。

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

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

1

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

但是,如果在* nix上执行,您可能只需要redirect all output to a file(或者只是错误输出)。但这不是一个通用的解决方案。

1

你得catch那个异常一些如何。如果你抓住它,后来决定写一个文件就没问题。鉴于你上面有什么,我会建议第二种方式,因为if语句没有办法实际得到异常。

0

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

在常规代码行上检测到异常,因此不能将if添加到每个代码中。是的,尝试/捕捉(写)是唯一的方法。

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

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; 
    } 
} 
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()); 
} 
+0

你这样做时应该小心,因为你可以打破很多东西。 – 2012-01-31 15:55:46

+0

我不认为你想要使用这种方法。要到达这个处理函数,你必须保持异常不被捕获(如果你想抛出任何东西,所有的异常都不会被捕获)。如果你想要给文件写一个异常并处理异常情况,那么你会很失败。 – philwb 2012-01-31 22:10:28

1

你不能直java的,除非你仪器的字节码(您可以用剂和类似asm东西做)这样做。你可以用一个方面来做,这比字节代码工具方法更容易。以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(); 
    } 
} 

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

+0

你必须爱AOP来处理这样的事情! – 2012-01-31 04:14:55