処理のためにいくつかのトランザクションを実行する小さなコードがあります。各トランザクションには、外部プログラムによって生成されたトランザクション番号が付けられており、必ずしも順序付けられているわけではありません。処理コードで例外をキャッチすると、それをメインクラスにスローし、後で確認するためにログに記録します。このスローされた例外にトランザクション番号を追加したいと思います。正しいスタックトレースを維持したままこれを行うことは可能ですか?
例えば:
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;
}
}
}
試してください:
throw new Exception("transction: " + transNbr, E);
例外は通常不変です。作成されたメッセージは変更できません。ただし、できることはチェーンの例外です。
throw new TransactionProblemException(transNbr, originalException);
スタックトレースは次のようになります
TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...
Cause引数も受け取るException
コンストラクターがあります: Exception(String message、Throwable t) 。
これを使用して、スタックトレースを伝播できます。
try{
//...
}catch(Exception E){
if(!transNbr.equals("")){
throw new Exception("transaction: " + transNbr, E);
}
//...
}
例外を拡張しながらスーパーを使用できます
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);
}
}
}
例外メッセージは次の方法で使用できます。
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;
}
}
次のコードは、私のために働いた簡単な例です。関数main
を親関数、divide
を子関数として呼び出しましょう。
基本的に私はで新しい例外をスローしますmy custom message(親の呼び出し用)子関数で例外が最初に子で例外をキャッチします。
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
は、中間のどこかでエラーが発生した場合は実行されません。