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

あなたはcatchどういうわけかその例外をしなければなりません。あなたがそれを捕まえて、後でそれを書くことに決めるならば、ファイルは大丈夫です。上記の内容を考えると、ifステートメントには実際に例外を取得する方法がないため、2番目の方法をお勧めします。

于 2012-01-30T22:26:50.343 に答える
1

Javaでは、それは不可能だと思います

ただし、* nix で実行した場合は、すべての出力をファイル(またはエラー出力のみ)にリダイレクトすることができます。しかし、それは一般的な解決策ではありません。

于 2012-01-30T22:26:08.700 に答える
1

メソッド内の特定のエラーをキャッチする唯一の方法は、Try/Catch ブロックを使用することです。ただし、キャッチされていないすべての例外 (Try/Catch を持たない例外) をクラスでキャッチすることは可能です。

UncaughtExceptionHandlerカスタム クラスを記述して、Java のインターフェイスを実装できます。

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

バイトコードをインストルメント化しない限り、ストレート Java では実行できません (エージェントやasmなどで実行できます)。アスペクトを使用すると、バイト コードのインストルメンテーション アプローチよりも簡単に実行できます。たとえば、アスペクトを取ります。側面は次のとおりです。

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ところで:スローされる最も抽象的な例外を宣言することは決してありません。一部の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;
    }
}

しかし、それをキャッチした場合、通常はスローしないため、例外をスローすることをまったく宣言しません。

于 2012-01-30T22:27:52.853 に答える
0

2番目のブロックでは、すでに例外をキャッチしているため、例外、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 に答える