是否可以创建一个返回 try/catch 的方法?



假设我们有很多方法想要使用System.out.println(...)打印一些 fx 的东西 然后我们可以创建一个类似

public void print(String msg) {
System.out.println(...)
}

然后我们可以做:print("Some message")它更快,节省我们每次都写System.out.println(...)的时间。

所以现在到案子。我正在使用Java I/O练习,它想要地狱很多try/catch。因此,我不必每次都编写一个try/catch块,我可以做类似的事情吗

public sometype tryCatch (String objThatCanThrowExc) {
clause = "try {
" + objThatCanThrowExc + "
} catch(Exception e) { 
print(e); 
} "
return clause;
}

然后做这样的事情

public void server(int port) {
ServerSocket ss = null; 
//Assume ss is not null, and client is a Socket
tryCatch("client = ss.accept();");
...
}

使用上面的代码,我只是想表达我想做什么。我不确定是否有一些聪明的东西可以帮助我实现这一目标。另一种可能更好的方法是,如果我能做这样的事情

public void server(int port) {
ServerSocket ss = null;
tryCatch() {
client = ss.accept();
}
...
}

我没有太多的编程经验,所以我知道这是一个愚蠢的问题,但谁知道呢,也许有一些聪明的东西

如果我理解正确,您要做的是调用可能抛出的多个 IO 函数,但不为每个函数编写相同的"catch"逻辑。

你是对的,你想做的是以某种方式"传递"可能抛出的代码,这些代码可能会扔到另一个为你处理捕获的方法中。在Java中,这种机制不是字符串,而是lambda函数。

我们可以像这样使用它们:

import java.io.*;
class Main {
@FunctionalInterface
public interface Action {
void run() throws Exception;
}
private static void printExceptionAndContinue(final Action action) {
try {
action.run();
} catch(Exception error) {
System.out.println(error.toString());
}
}
public static void main(String[] args) {
printExceptionAndContinue(() -> {
// Here goes some code that might throw!
throw new Exception("Oh no!");
});    

printExceptionAndContinue(() -> {
// And some more
System.out.println("Still gets called!");
});
}
}

对于那些说"字符串"代码不能用强类型编译语言键入和解释的人,我鼓励他们查看 F# 引文。

您要查找的概念称为Try 类型。它类似于java.util.Optional,可以是"存在"或"空";尝试可以是"成功"或"失败"。它没有内置在Java中,但Vavr库是一个常用的实现。

在您的示例中,您使用的"子句"是一个字符串,因此除非您尝试将其解析为代码(这很复杂),否则它将不起作用。

相反,最好在 try 部分和 catch 部分使用不同的 return 语句。如果您收到一个错误,指出您没有返回任何内容,请尝试在返回 null 或零或空字符串的 try/catch 语句之后放置一个虚拟的 return 语句。

如果 try-catch 需要对对象进行某些特定操作,我们可以。

说。我们有一个接口

公共接口 - 一个操作

public interface oneOperation{
public void execute() throws Exception;
default void invoke(){
try {
this.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}

现在接口的 impls 只实现 execute() 方法。

其他使用 impls 的对象可以调用 invoke() 方法,以防它们希望不抛出异常

不确定这是否是您要找的..

最新更新