записать выброшенное исключение в файл - PullRequest
1 голос
/ 31 января 2012

возможно ли записать выброшенное исключение в файл без использования блоков 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 ]

1 голос
/ 31 января 2012

Единственный способ отловить определенные ошибки в методе - использовать блок 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());
}
1 голос
/ 31 января 2012

Вы не можете сделать это с прямой 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 ();
    }
}

Как только вы добавите это в классы вашего приложения, все сгенерированные исключения пройдут здесь через точку соединения.Я только что распечатал стопку, но вы можете записать ее в файл или сделать что хотите.Когда точка соединения завершается, исключение продолжает генерироваться, так что вызывающий код может его обработать.Очевидно, вам нужно изменить определение pointcut в соответствии с вашими классами, но это общая идея.

1 голос
/ 31 января 2012

Вы должны catch это исключение как-то. Если вы поймете это, а потом решите написать файл, все в порядке. Учитывая то, что у вас есть выше, я бы предложил второй путь, потому что оператор if не может реально получить исключение.

1 голос
/ 31 января 2012

В Java я не думаю, это возможно.

Однако, если он выполняется в * nix, вы можете просто перенаправить весь вывод в файл (или просто вывод ошибок). Но это не общее решение.

0 голосов
/ 31 января 2012

Вам нужно будет поймать исключение и сбросить его.

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;
    }
}
0 голосов
/ 31 января 2012

Во втором блоке вы уже перехватили исключение, поэтому нет необходимости для исключений, SqlException.

В обычной строке кода обнаружено исключение, поэтому вы не можете добавить if к каждому из них.Да, try / catch (write) - единственный способ.

Если ... вы используете if / else вместо обработки исключений

0 голосов
/ 31 января 2012

Нет.

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

Откуда исходит Исключение?

Кстати: вы никогда не объявляете самое абстрактное исключение 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;
    }
}

Но если вы ловите его, вы обычно не бросаете, и, следовательно, вообще не объявляете бросать исключения.

...