MDC.remove() 或 MDC.put() 中是否强制进行异常处理?

问题描述 投票:0回答:1
import org.slf4j.MDC;

            MDC.put(ID1, id1);
        MDC.put(ID2, id2);
        MDC.put(ID3, id3);
        try {
              return joinPoint.proceed();
        } finally {
            MDC.remove(ID1);
            MDC.remove(ID2);
            MDC.remove(ID3);
        }
  • 假设有上面的代码, remove、put()也可能出现异常
  • 如果id1删除过程中出现异常,则无法删除不相关的id2、id3。为了防止这个问题,我是否必须对上述代码的该部分采取额外的处理异常的过程?就像附加的代码一样 下面的代码只针对ID1进行处理,但是每次添加都需要一个try-catch语句
        MDC.put(ID1, id1);
        MDC.put(ID2, id2);
        MDC.put(ID3, id3);
        try {
              return joinPoint.proceed();
        } finally {
                try{
                     MDC.remove(ID1); 
                } finally {
                           MDC.remove(ID2);
                   MDC.remove(ID3);
                }
           
          
        }
  • 没有编译器异常

问题如有不足,请指出。我反映一下再上传吧

java exception aop thread-local mdc
1个回答
0
投票

我认为您实际上是在询问进行删除的正确方法。

如果我们假设任何

put
remove
都可以抛出异常,并且不清理 MDC 是不可接受的,那么正确的写法是:

try {
    MDC.put(ID1, id1);
    try {
        MDC.put(ID2, id2);
        try {
            MDC.put(ID3, id3);
        } finally {
            MDC.remove(ID3);
        }
    } finally {
        MDC.remove(ID2);
    }
} finally {
    MDC.remove(ID1);
}

另一方面,如果我们将 MDC javadocs 视为定义行为,那么只有当键为

remove
时,才会抛出异常。如果你能保证null
ID1
ID2
不是
ID3
。那么上面的代码就没有必要了。
    

© www.soinside.com 2019 - 2024. All rights reserved.