在 Java 中创建异常安全执行包装器
Create exception safe execution wrapper in Java
我有很多使用 try
/catch
的代码,几乎在所有情况下我都采取相同的操作。我想做的是通过创建一些我可以直接说的东西来简化我的错误处理
ManagedExceptionEnvironment() {
// The code that might throw exceptions
}
然后在 ManagedExceptionEnvironment
内部,它具有共享的错误处理逻辑。
我最初的想法是让 ManagedExceptionEnvironment
的构造函数采用 Runnable
,但是如果您将可能引发异常的逻辑放入匿名 Runnable
的 run
方法然后它仍然抱怨没有实现 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());
其中 Whatever
是 earthShatteringKaboom()
returns 的类型。如果 earthShatteringKaboom()
returns 一个对象,你会在 result
中得到它。如果它抛出异常,则执行您的标准捕获逻辑并且 result
是 null
.
(注意:我正在展示示例 boomProtector()
调用的 Java 8 语法,您需要在您的项目中启用它,例如通过 [= 中的文件 > 项目设置 > 应用程序30=] Studio — 或者,使用 Callable<T>
)
的匿名内部 class 实现
我有很多使用 try
/catch
的代码,几乎在所有情况下我都采取相同的操作。我想做的是通过创建一些我可以直接说的东西来简化我的错误处理
ManagedExceptionEnvironment() {
// The code that might throw exceptions
}
然后在 ManagedExceptionEnvironment
内部,它具有共享的错误处理逻辑。
我最初的想法是让 ManagedExceptionEnvironment
的构造函数采用 Runnable
,但是如果您将可能引发异常的逻辑放入匿名 Runnable
的 run
方法然后它仍然抱怨没有实现 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());
其中 Whatever
是 earthShatteringKaboom()
returns 的类型。如果 earthShatteringKaboom()
returns 一个对象,你会在 result
中得到它。如果它抛出异常,则执行您的标准捕获逻辑并且 result
是 null
.
(注意:我正在展示示例 boomProtector()
调用的 Java 8 语法,您需要在您的项目中启用它,例如通过 [= 中的文件 > 项目设置 > 应用程序30=] Studio — 或者,使用 Callable<T>
)