2012-01-30 5 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이 던져 질 것이라고 선언하지 마십시오. 일부 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; 
    } 
} 

그러나 잡는다면 일반적으로 던지지 않으므로 예외를 발생시키지 않아도됩니다.

1

, 나는 는 가능하다고 생각하지 않습니다.

그러나 * nix에서 실행하면 redirect all output to a file (또는 오류 출력 만 가능)이 가능합니다. 그러나 그것은 일반적인 해결책이 아닙니다.

1

당신은 catch 예외가 있습니다. 당신이 그것을 붙잡고 나중에 그것을 쓰기로 결정하면 파일은 괜찮습니다. 위의 내용을 감안할 때 if 문에 실제로 예외가 발생하지 않으므로 두 번째 방법을 제안합니다.

0

두 번째 블록에서 이미 예외를 잡았으므로 Exception, SqlException을 throw 할 필요가 없습니다.

일반 코드 줄에서 예외가 감지되어 각각에 if를 추가 할 수 없습니다. 예, try/catch (쓰기)가 유일한 방법입니다.

은 ...하지 않는 한 당신은

0

당신은 예외를 catch하고 다시 발생해야합니다 예외 처리 대신하는 경우/다른 사용합니다.

1

특정 오류를 catch하는 유일한 방법은 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

많은 일을 해칠 수 있으므로이 작업을 수행 할 때는주의해야합니다. –

+0

이 방법을 사용하고 싶지 않습니다. 이 핸들러에 도달하려면 잡히지 않은 예외를 남겨 두어야합니다 (던져진 모든 것을 처리하려는 경우 모든 예외가 포착되지 않음). 파일에 예외를 작성하고 예외 조건을 처리하기를 원한다면 운이 좋을 것입니다. – philwb

1

당신 캔트은 악기 (당신이 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(); 
    } 
} 

응용 프로그램 클래스에이 코드를 추가하면 모든 예외가 여기에서 조인 포인트를 통과합니다. 방금 스택을 인쇄했지만 파일에 기록하거나 원하는대로 할 수 있습니다. 조인 포인트가 완료되면 호출 코드가 처리 할 수 ​​있도록 예외가 계속 throw됩니다. 분명히 클래스에 맞게 pointcut 정의를 변경해야하지만 이것은 일반적인 아이디어입니다.

+0

이런 일을 처리하기 위해 AOP를 사랑해야합니다! –

관련 문제