gpt4 book ai didi

java - 如何处理在 try-catch 中抛出普通异常的方法

转载 作者:行者123 更新时间:2023-12-02 04:28:43 25 4
gpt4 key购买 nike

考虑以下场景:我有一个对象池,我 (1) 借用一个对象,(2) 对该对象执行某些操作,然后 (3) 必须将其返回到池中。挑战在于前两个步骤可能会引发检查异常,而步骤 (1) 甚至会引发普通的异常

让我向您展示我当前正在使用的代码:

MyObject objectFromPool = null;
try {
objectFromPool = pool.borrowObject(); // step (1), throws plain Exception
objectFromPool.doSomething(); // step (2), throws FailedToDoSomethingException
} catch (FailedToDoSomethingException e) {
throw new MyCustomRuntimeException(e);
} catch (Exception e) {
// Now what? Did objectFromPool.doSomething() throw this exception or pool.borrowObject()?
} finally {
if (objectFromPool != null) {
pool.returnObject(objectFromPool); // step (3)
}
}

对于如何处理普通的异常有什么建议吗?我不希望这段代码抛出已检查的异常,因为调用者无论如何都不知道如何处理它。但我仍然想区分来自 pool.borrowObject()objectFromPool.doSomething() 的异常,因为前者表示“技术”异常,后者表示“业务”异常“问题。

注意:我既不控制 pool.borrowObject() 也不控制 objectFromPool.doSomething() 的代码。两者都来自外部库,我不知道它们可能会抛出什么样的 RuntimeException

最佳答案

我认为更好的方法是将可疑的异常封装成一个特定的异常,该异常将落入最终的捕获中,最后:

    MyObject objectFromPool = null;
try {
try {
objectFromPool = pool.borrowObject(); // step (1), throws plain Exception
} catch (Exception e) {
// Encapsulate into an specific exception type:
throw new MyOwnException(e);
}
objectFromPool.doSomething(); // step (2), throws FailedToDoSomethingException
} catch (FailedToDoSomethingException e) {
throw new MyCustomRuntimeException(e);
} catch (MyOwnException e) {
...
} finally {
if (objectFromPool != null) {
pool.returnObject(objectFromPool); // step (3)
}
}

通过这种方式,您可以保留原始的 catch 和 finally 算法,而无需怀疑每个异常来自何处。

还有一件事:请记住,异常甚至可以是运行时异常。您是否也对捕获 RuntimeException 感兴趣?如果没有,添加一个额外的 catch 让它们传播:

        try {
objectFromPool = pool.borrowObject(); // step (1), throws plain Exception
} catch (RuntimeException e) {
// Let it propagate:
throw e;
} catch (Exception e) {
// Encapsulate into an specific exception type:
throw new MyOwnException(e);
}

关于java - 如何处理在 try-catch 中抛出普通异常的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31804711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com