在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());