避免try-catch-finally地狱

问题描述

假设我有简单的连接并从数据库中选择。这段代码的悲伤部分是几乎可以说 40-50% 是 try-catch 样板代码。我该如何处理?

$("#recipes").change(function() {
    $("#recipeDetailsDiv").show();
});

解决方法

避免try-catch-finally 地狱的方法是使用try-with-resources。它已添加到 Java 7 中的 Java 语言中。有关此 Java 语言功能的更详细说明,请参阅 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

这是使用 try-with-resources 的代码的样子

 public static void main(String[] args) throws Exception {
    String sql = "SELECT id,name from user";   
    try (Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost/test","root","root");
         Statement statement = connection.createStatement();
         ResultSet rs = statement.executeQuery(sql))
    {
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");

            System.out.print("ID: " + id);
            System.out.print(",name: " + name);
            System.out.println();
        }
    }
}

请注意,try-with-resources 将按照与此相反的顺序自动关闭每个声明的资源(connectionstatementrs)它们已被声明,并将适当处理在此期间可能出现的任何异常。所以我们不需要任何显式的 close() 调用。

如果这是生产代码,我们不应将 main 声明为抛出异常。我们应该妥善处理异常;即记录它们和/或产生用户友好的错误消息。我只是在这里走捷径……因为这是您原始问题的侧边栏。

,

您可以使用 try-with-resources 使您的代码更简洁,例如-

        try(Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost/test","root"
        );Statement statement = connection.createStatement()) {
         
            String sql = "SELECT id,name from user";
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");

                System.out.print("ID: " + id);
                System.out.print(",name: " + name);
                System.out.println();
            }
            rs.close();
        } catch (Exception se) {
            se.printStackTrace();
        }

它将处理关闭资源。有关详细信息,请访问 Oracle Docs

,

DataSource

使用您的所有连接详细信息(例如用户名和密码)设置一个 DataSource 对象。您的 JDBC driver 可能带有一个简单的实现。

SomeDataSourceImplementation ds = new SomeDataSourceImplementation() ;
ds.setUserName( "Scott" ) ;
ds.setPassword( "Tiger" ) ;
…
DataSource dataSource = ds ;

尝试资源语法

try-with-resources 语法是多年前添加的,以帮助简化此类代码。见Tutorial by Oracle

如果抛出异常,AutoCloseable 对象将按照它们列出的相反顺序关闭。

        String sql = "SELECT id,name from user";
        try (
            Connection conn = dataSource.getConnection() ;
            Statement statement = conn.createStatement() ;
            ResultSet rs = statement.executeQuery(sql) ;
        ) {
            while ( rs.next() ) {
                int id = rs.getInt( "id" ) ;
                String name = rs.getString( "name" ) ;

                System.out.print( "ID: " + id );
                System.out.print( ",name: " + name ) ;
                System.out.println();
            }
        } catch ( SQLException e ) {
            e.printStackTrace();
        }
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...