首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中创建异常安全执行包装器

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

Stack Overflow用户
提问于 2018-08-19 00:59:05
回答 3查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
ManagedExceptionEnvironment() {
    // The code that might throw exceptions
}

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

我最初的想法是让ManagedExceptionEnvironment的构造函数接受一个Runnable,但是如果你把可能抛出异常的逻辑放在匿名Runnablerun方法中,那么它仍然会抱怨没有实现try/catch,即使你传递给它的容器可以处理它。

我认为另一种选择是只在最高级别处理错误,并让它们不断被抛出另一个级别,尽管这似乎相当有风险。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-19 01:11:03

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

代码语言:javascript
复制
public static <T> T boomProtector(Callable<T> thingThatMightGoBoom) {
  try {
    return thingThatMightGoBoom.call();
  }
  catch(Exception e) {
    // TODO: your standard catch logic
  }

  return null;
}

然后,在您需要它的地方,您可以调用:

代码语言:javascript
复制
Whatever result = boomProtector(() -> earthShatteringKaboom());

其中WhateverearthShatteringKaboom()返回的类型。如果earthShatteringKaboom()返回一个对象,您将在result中获取它。如果抛出异常,则执行您的标准捕获逻辑,并且resultnull

(注意:我展示了示例boomProtector()调用的Java8语法,您需要在项目中启用它,例如通过Android Studio中的文件>项目设置>应用程序-或者使用Callable<T>的匿名内部类实现)

票数 4
EN

Stack Overflow用户

发布于 2018-08-19 01:07:19

将其封装在如下的接口中如何:

代码语言:javascript
复制
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()不抛出异常。

票数 1
EN

Stack Overflow用户

发布于 2018-08-19 01:07:52

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51910838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档