代码之家  ›  专栏  ›  技术社区  ›  Nick Chapman

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

  •  1
  • Nick Chapman  · 技术社区  · 6 年前

    我有很多代码 try / catch

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

    然后在里面 ManagedExceptionEnvironment 它具有共享的错误处理逻辑。

    我最初的想法是 管理感知环境 的构造函数获取 Runnable ,但如果将可能引发异常的逻辑放入匿名 可运行 run 方法仍然抱怨没有实现 / 即使你要把它送到的那个集装箱也会处理好的。

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

    3 回复  |  直到 6 年前
        1
  •  3
  •   CommonsWare    6 年前

    除非 ManagedExceptionEnvironment 如果要扩展一些现有的类,那么在这里使用Java类与 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());
    

    哪里 Whatever 是那种 earthShatteringKaboom() 返回。如果 惊天动地() 返回一个对象 result . 如果抛出异常,则执行标准catch逻辑并 null .

    (注意:我将为示例显示Java8语法 boomProtector() 调用,您需要在项目中启用它,例如通过Android Studio中的File>project Settings>app,或者使用 Callable<T> )

        2
  •  1
  •   Janus Varmarken    6 年前

    把它包装在这样的界面中怎么样:

    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() 没有。

        3
  •  1
  •   GhostCat    6 年前

    您可以将异常作为接口/类/方法(泛型)签名的一部分。看我的问题( How to not throw a generically specified exception? )例如。

    例如,您可以将其命名为“process()”,而不是调用方法“newInstance()”。然后在此基础上创建一个类型安全处理程序。客户只需传递lambda表达式。