在 Java 中创建异常安全执行包装器

Create exception safe execution wrapper in Java

我有很多使用 try/catch 的代码,几乎在所有情况下我都采取相同的操作。我想做的是通过创建一些我可以直接说的东西来简化我的错误处理

ManagedExceptionEnvironment() {
    // The code that might throw exceptions
}

然后在 ManagedExceptionEnvironment 内部,它具有共享的错误处理逻辑。

我最初的想法是让 ManagedExceptionEnvironment 的构造函数采用 Runnable,但是如果您将可能引发异常的逻辑放入匿名 Runnablerun 方法然后它仍然抱怨没有实现 try/catch 即使你传递它的容器会处理它。

我想另一种选择是只在最高级别处理错误,并让它们不断被抛出到另一个级别,尽管这看起来相当冒险。

编辑:我想这里的一个选项(我不知道这是否是 Java 中的内容)是某种宏?

编辑 2:刚刚粗略地阅读了一些关于使用 C 预处理器将宏注入 Java src 的内容,这真的很可怕。所以宏作为解决方案出来了。

如何将其包装在这样的界面中:

class ManagedExceptionEnvironment {
    public static void safeExecution(Wrapper w) {
        try {
            w.codeThatThrows();
        } catch (Exception e) {
            // your error handling
        }
    }


    public static void example() {
        safeExecution(() -> { throw new Exception(); });
        // Or the old-fashioned way:
        safeExecution(new Wrapper() {
            @Override
            public void codeThatThrows() throws Exception {
                throw new Exception();
            }
        });
    }

    interface Wrapper {
        public void codeThatThrows() throws Exception;
    }
}

诀窍在于类似于 Runnable.run() 的方法指定它可能会抛出异常,而 run() 则不会。

您可以将异常作为接口/class/方法的(通用)签名的一部分。以我的问题 ( ) 为例。

例如,您可以将方法命名为 "process()",而不是调用方法 "newInstance()"。然后围绕它创建一个类型安全的处理程序。客户只需传递 lambda 表达式即可。

基本上定义您自己的包装器(如其他答案所示:-)

除非 ManagedExceptionEnvironment 打算扩展一些现有的 class,否则在这里使用 Java class 而不是 static 没有任何价值方法。所以,你可以这样写:

public static <T> T boomProtector(Callable<T> thingThatMightGoBoom) {
  try {
    return thingThatMightGoBoom.call();
  }
  catch(Exception e) {
    // TODO: your standard catch logic
  }

  return null;
}

那么,有需要的地方可以拨打:

Whatever result = boomProtector(() -> earthShatteringKaboom());

其中 WhateverearthShatteringKaboom() returns 的类型。如果 earthShatteringKaboom() returns 一个对象,你会在 result 中得到它。如果它抛出异常,则执行您的标准捕获逻辑并且 resultnull.

(注意:我正在展示示例 boomProtector() 调用的 Java 8 语法,您需要在您的项目中启用它,例如通过 [= 中的文件 > 项目设置 > 应用程序30=] Studio — 或者,使用 Callable<T>)

的匿名内部 class 实现