Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建异常安全执行包装器_Java_Android_Exception_Error Handling_Exception Handling - Fatal编程技术网

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

在Java中创建异常安全执行包装器,java,android,exception,error-handling,exception-handling,Java,Android,Exception,Error Handling,Exception Handling,我有很多代码使用try/catch,在几乎所有情况下,我都采取相同的操作。我想做的是通过创建一些我可以说的东西来简化我的错误处理 ManagedExceptionEnvironment() { // The code that might throw exceptions } 然后在ManagedExceptionEnvironment内部,它具有共享的错误处理逻辑 我最初的想法是让ManagedExceptionEnvironment的构造函数采用Runnable,但是,如果您将可能

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

ManagedExceptionEnvironment() {
    // The code that might throw exceptions
}
然后在
ManagedExceptionEnvironment
内部,它具有共享的错误处理逻辑

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

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

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


编辑2:只是粗略地阅读了一些关于使用C预处理器将宏注入JavaSRC的内容,这真是太可怕了。因此,宏是一种解决方案。

将其包装到如下界面中如何:

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()
则不会。您可以将异常作为接口/类/方法的(通用)签名的一部分。以我的问题()为例

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


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

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

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

  return null;
}
其中
which
earthShatteringKaboom()
返回的类型。如果
earthShatteringKaboom()
返回一个对象,则在
result
中获得该对象。如果抛出异常,则执行标准捕获逻辑,
result
null


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

Lambda表达式可用于@commonware,因此要明白这一点,android的所有版本都支持lambdas,但不支持Java8的所有其他功能?这是一个混合包。重要的是Java8类在API级别24之前是不可用的。Lambda表达式不涉及Java8类。Android工具链为lambda表达式生成编译代码,可以在任何版本的Android上运行。
Whatever result = boomProtector(() -> earthShatteringKaboom());