我用try
/catch
编写了很多代码,几乎在所有情况下我都会采取相同的操作。我想要做的是通过创建一些东西来简化我的错误处理,我可以这样说
ManagedExceptionEnvironment() {
// The code that might throw exceptions
}
然后在ManagedExceptionEnvironment
内部,它拥有共享的错误处理逻辑。
我最初的想法是让ManagedExceptionEnvironment
的构造函数接受一个Runnable
,但是如果你把可能抛出异常的逻辑放在匿名Runnable
的run
方法中,那么它仍然会抱怨没有实现try
/catch
,即使你传递给它的容器可以处理它。
我认为另一种选择是只在最高级别处理错误,并让它们不断被抛出另一个级别,尽管这似乎相当有风险。
编辑:我猜这里的一个选项(我不知道这是不是Java中的东西)是某种宏?
编辑2:我粗略地读了一下关于使用C预处理器将宏注入Java src的内容,这真的很可怕。所以宏作为一种解决方案出现了。
发布于 2018-08-19 01:11:03
除非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()
返回的类型。如果earthShatteringKaboom()
返回一个对象,您将在result
中获取它。如果抛出异常,则执行您的标准捕获逻辑,并且result
为null
。
(注意:我展示了示例boomProtector()
调用的Java8语法,您需要在项目中启用它,例如通过Android Studio中的文件>项目设置>应用程序-或者使用Callable<T>
的匿名内部类实现)
发布于 2018-08-19 01:07:19
将其封装在如下的接口中如何:
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()
不抛出异常。
发布于 2018-08-19 01:07:52
您可以将异常作为接口/类/方法的(泛型)签名的一部分。请参见我的问题( How to not throw a generically specified exception? )作为示例。
例如,您可以将其命名为"newInstance()“,而不是调用该方法"process()”。然后围绕它创建一个类型安全处理程序。客户端只需传递lambda表达式即可。
基本上定义您自己的包装器(如另一个答案所示:-)
https://stackoverflow.com/questions/51910838
复制相似问题