66

処理のためにいくつかのトランザクションを実行する小さなコードがあります。各トランザクションにはトランザクション番号が付けられています。トランザクション番号は外部プログラムによって生成され、必ずしも順序付けられているとは限りません。処理コードで例外をキャッチすると、それをメインクラスにスローし、後で確認するためにログに記録します。このスローされた例外にトランザクション番号を追加したいと思います。正しいスタックトレースを維持しながらこれを行うことは可能ですか?

例えば:

public static void main(String[] args) {
    try{
        processMessage();
    }catch(Exception E){
        E.printStackTrace();
    }

}

private static void processMessage() throws Exception{
    String transNbr = "";
    try{
        transNbr = "2345";
        throw new Exception();
    }catch(Exception E){
        if(!transNbr.equals("")){
            //stack trace originates from here, not from actual exception
            throw new Exception("transction: " + transNbr); 
        }else{
            //stack trace gets passed correctly but no custom message available
            throw E;
        }
    }
}
4

7 に答える 7

110

試す:

throw new Exception("transction: " + transNbr, E); 
于 2012-09-24T15:41:28.853 に答える
19

例外は通常不変です。作成後にメッセージを変更することはできません。ただし、実行できるのはチェーン例外です。

throw new TransactionProblemException(transNbr, originalException);

スタックトレースは次のようになります

TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...
于 2012-09-24T15:44:12.560 に答える
10

Exceptioncause引数も受け取るコンストラクターがあります:Exception (String message、Throwable t)

これを使用して、スタックトレースを伝播できます。

try{
    //...
}catch(Exception E){
    if(!transNbr.equals("")){
        throw new Exception("transaction: " + transNbr, E); 
    }
    //...
}
于 2012-09-24T15:42:59.027 に答える
2

例外を拡張しながらスーパーを使用できます

if (pass.length() < minPassLength)
    throw new InvalidPassException("The password provided is too short");
 } catch (NullPointerException e) {
    throw new InvalidPassException("No password provided", e);
 }


// A custom business exception
class InvalidPassException extends Exception {

InvalidPassException() {

}

InvalidPassException(String message) {
    super(message);
}
InvalidPassException(String message, Throwable cause) {
   super(message, cause);
}

}

}

ソース

于 2013-12-26T07:46:10.257 に答える
0

ExceptionからExceptionクラスextendを記述し、次のように属性を追加できます。 `public class PaymentException extends Exception {public Object data;

public PaymentException(Throwable cause) {
    super(cause);
}

public void setData(Object o) {
    data = o;
}
public Object getData() {
    return data;
}

} `

于 2021-06-27T10:36:27.137 に答える
-1

次の方法で例外メッセージを使用できます。-

 public class MyNullPointException extends NullPointerException {

        private ExceptionCodes exceptionCodesCode;

        public MyNullPointException(ExceptionCodes code) {
            this.exceptionCodesCode=code;
        }
        @Override
        public String getMessage() {
            return exceptionCodesCode.getCode();
        }


   public class enum ExceptionCodes {
    COULD_NOT_SAVE_RECORD ("cityId:001(could.not.save.record)"),
    NULL_POINT_EXCEPTION_RECORD ("cityId:002(null.point.exception.record)"),
    COULD_NOT_DELETE_RECORD ("cityId:003(could.not.delete.record)");

    private String code;

    private ExceptionCodes(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}
于 2013-07-01T07:14:31.800 に答える
-1

次のコードは、私にとって有効な簡単な例です。関数mainを親関数およびdivide子関数として呼び出します。
基本的に、子関数で例外が発生した場合、最初に子で例外をキャッチすることにより、カスタムメッセージ(親の呼び出し用)で新しい例外をスローします。

class Main {
    public static void main(String args[]) {
        try{
            long ans=divide(0);
            System.out.println("answer="+ans);
        }
        catch(Exception e){
            System.out.println("got exception:"+e.getMessage());

        }

    }
    public static long divide(int num) throws Exception{
        long x=-1;
        try {
            x=5/num;
        }
        catch (Exception e){
            throw new Exception("Error occured in divide for number:"+num+"Error:"+e.getMessage());
        }
        return x;
    }
}  

return xその間のどこかでエラーが発生した場合、最後の行は実行されません。

于 2018-06-24T16:28:00.473 に答える