首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中维护堆栈跟踪的同时向抛出的异常添加自定义消息

在Java中维护堆栈跟踪的同时向抛出的异常添加自定义消息
EN

Stack Overflow用户
提问于 2012-09-24 23:40:06
回答 7查看 174.7K关注 0票数 65

我有一小段代码,可以运行一些事务进行处理。每笔交易都标有一个交易号,该交易号由外部程序生成,不一定要排序。当我在处理代码中捕获到异常时,我会将其抛出到主类中,并将其记录下来以供以后复查。我想将事务编号添加到这个抛出的异常中。有没有可能在保持正确的堆栈跟踪的同时做到这一点?

例如:

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-09-24 23:41:29

尝试:

代码语言:javascript
复制
throw new Exception("transction: " + transNbr, E); 
票数 107
EN

Stack Overflow用户

发布于 2012-09-24 23:44:13

异常通常是不可变的:您不能在创建它们之后更改它们的消息。但是,您可以做的是链异常:

代码语言:javascript
复制
throw new TransactionProblemException(transNbr, originalException);

堆栈跟踪将如下所示

代码语言:javascript
复制
TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...
票数 17
EN

Stack Overflow用户

发布于 2012-09-24 23:42:59

还有一个带有原因参数的Exception构造函数:Exception(String message, Throwable t)

您可以使用它来传播堆栈跟踪:

代码语言:javascript
复制
try{
    //...
}catch(Exception E){
    if(!transNbr.equals("")){
        throw new Exception("transaction: " + transNbr, E); 
    }
    //...
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12568340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档