是否可以创建一个返回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();
        }
        ...
}

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

解决方法

您要寻找的概念称为 Try type 。它类似于java.util.Optional,可以是“存在”或“空”。尝试可以是“成功”或“失败”。它不是Java内置的,但是Vavr库是一种常用的实现。

,

如果我正确理解,您想要做的是调用可能抛出的多个IO函数,但无需为每个函数编写相同的“捕获”逻辑。

您说对了,您想要做的就是以某种方式“传递”可能会扔到另一个为您处理捕获方法的代码中。在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# quotations

,

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

相反,最好在try部分和catch部分使用不同的return语句。如果出现错误提示您什么都不返回,请尝试在try / catch语句后放置一个虚拟return语句,该语句返回null或零或空字符串。

,

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

说。我们有一个界面

公共接口-oneOperation

public interface oneOperation{

    public void execute() throws Exception;

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

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

使用impls的其他对象可以调用invoke()方法,以防它们不引发异常

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