gpt4 book ai didi

exception - 向Groovy中的Exception或Error添加更多上下文

转载 作者:行者123 更新时间:2023-12-02 00:53:27 26 4
gpt4 key购买 nike

当我只想向发生的任何异常添加更多上下文(包括解析错误,甚至内存不足)时,我将代码编写如下

    try {
new JsonSlurper().parseText(response)
} catch (any) {
throw new IllegalStateException("Cannot parse response:\n$response", any)
}

这可以正常工作,但是我可能最终将 OutOfMemoryError包裹在听起来不正确的 IllegalStateException中,因为进一步可能有专门针对 Error throwables的异常处理机制。

有什么方法可以向异常添加更多上下文并仍然保留其原始类型或类别?即当我得到 OOME时,我想重新抛出 Error,当我得到一些解析异常时,我想重新抛出一些未经检查的异常等。当然,我不想为每个类别手动进行此操作,因为 OOME不太可能,我不想为特殊情况生成特殊代码(虽然我仍然想在技术上正确)。

最佳答案

您绝对可以通过groovy的metaprogramming功能来做到这一点。特别是,对于您的情况,metaclasses提供了您所需的一切。使用它们,您可以将contextData对象动态添加/附加到您希望它随身携带的exception中:

    private static void throwsEnhancedException() throws IOException {
try {
throwsBasicException()
} catch (IOException e) {
e.metaClass.contextData = "My context data"
throw e;
}
}

然后,要在代码的其他部分中检索此 contextData,只需检查 exception对象,如下所示:
    private static void doSomethingWithContextData(Closure contextDataHandler) throws IOException {
try {
throwsEnhancedException();
} catch (IOException e) {
// RETRIEVE `contextData` FROM `e` OR NULL IF THE PROPERTY DO NOT EXIST
def contextData = e.hasProperty('contextData')?.getProperty(e)

// DO SOMETHING WITH `contextData`
contextDataHandler(contextData)
}
}

在那里,我使用参数 contextDataHandler作为常规的 Closure 来灵活地处理 contextData

以下是此功能的完整工作演示:
import java.time.LocalDateTime

class ExceptionEnhancer {
static void main(String[] args) {
def logger = { println "${LocalDateTime.now()} - Context Data = [$it]" }
doSomethingWithContextData logger
}

private static void doSomethingWithContextData(Closure contextDataHandler) throws IOException {
try {
throwsEnhancedException();
} catch (IOException e) {
// RETRIEVE `contextData` FROM `e` OR NULL IF THE PROPERTY DO NOT EXIST
def contextData = e.hasProperty('contextData')?.getProperty(e)

// DO SOMETHING WITH `contextData`
contextDataHandler(contextData)
}
}

private static void throwsEnhancedException() throws IOException {
try {
throwsBasicException()
} catch (IOException e) {
e.metaClass.contextData = "My context data"
throw e;
}
}

public static void throwsBasicException() throws IOException {
throw new IOException();
}
}

Complete code on GitHub

希望这可以帮助。

关于exception - 向Groovy中的Exception或Error添加更多上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56109732/

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