From ac7917964f5ca0b82caa107daecd264b3614d9fb Mon Sep 17 00:00:00 2001 From: David Whitlock Date: Sat, 25 Apr 2026 09:14:18 -0700 Subject: [PATCH] H2 Database tools no longer print stack traces when an error occurs. --- .../cs/joy/jdbc/ExecuteH2DatabaseStatementIT.java | 14 +++++++++++++- .../pdx/cs/joy/jdbc/PrintH2DatabaseSchemaIT.java | 14 ++++++++++++++ .../cs/joy/jdbc/ExecuteH2DatabaseStatement.java | 5 +++-- .../edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchema.java | 5 +++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/examples/src/it/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatementIT.java b/examples/src/it/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatementIT.java index 3a04a3acb..d1e432c6b 100644 --- a/examples/src/it/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatementIT.java +++ b/examples/src/it/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatementIT.java @@ -299,5 +299,17 @@ public void testCountQuery() { assertThat(output, containsString("4")); assertThat(output, containsString("1 row(s) returned")); } -} + @Test + @Order(15) + public void testInvalidStatementPrintsErrorWithoutStackTrace() { + MainMethodResult result = invokeMain(ExecuteH2DatabaseStatement.class, dbFilePath, + "SELECT * FROM customers"); + String errorOutput = result.getTextWrittenToStandardError(); + + assertThat(errorOutput, containsString("Error:")); + assertThat(errorOutput, containsString("Table \"CUSTOMERS\" not found")); + assertThat(errorOutput, not(containsString("Exception in thread"))); + assertThat(errorOutput, not(containsString("\tat "))); + } +} diff --git a/examples/src/it/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchemaIT.java b/examples/src/it/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchemaIT.java index 6d2fdadcb..6f3614a55 100644 --- a/examples/src/it/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchemaIT.java +++ b/examples/src/it/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchemaIT.java @@ -4,10 +4,12 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; import java.time.LocalDate; @@ -183,4 +185,16 @@ public void testDatabaseFilePathIsDisplayed() { assertThat(output, containsString("Reading schema from H2 database:")); assertThat(output, containsString(dbFilePath)); } + + @Test + public void testInvalidDatabasePathPrintsErrorWithoutStackTrace(@TempDir Path tempDirectory) { + String invalidDatabasePath = tempDirectory.resolve("missing-db").toAbsolutePath() + ";IFEXISTS=TRUE"; + + MainMethodResult result = invokeMain(PrintH2DatabaseSchema.class, invalidDatabasePath); + String errorOutput = result.getTextWrittenToStandardError(); + + assertThat(errorOutput, containsString("Error:")); + assertThat(errorOutput, not(containsString("Exception in thread"))); + assertThat(errorOutput, not(containsString("\tat "))); + } } diff --git a/examples/src/main/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatement.java b/examples/src/main/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatement.java index 6bb4c3583..f7d488c30 100644 --- a/examples/src/main/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatement.java +++ b/examples/src/main/java/edu/pdx/cs/joy/jdbc/ExecuteH2DatabaseStatement.java @@ -14,9 +14,8 @@ public class ExecuteH2DatabaseStatement { * Main method that takes a database file path and SQL statement as arguments. * * @param args command line arguments: args[0] = database file path, args[1] = SQL statement - * @throws SQLException if a database error occurs */ - public static void main(String[] args) throws SQLException { + public static void main(String[] args) { if (args.length < 2) { System.err.println("Missing required arguments"); System.err.println("Usage: java ExecuteH2DatabaseStatement "); @@ -39,6 +38,8 @@ public static void main(String[] args) throws SQLException { try (Connection connection = H2DatabaseHelper.createFileBasedConnection(dbFile)) { executeStatement(connection, sqlStatement); + } catch (SQLException ex) { + System.err.println("Error: " + ex.getMessage()); } } diff --git a/examples/src/main/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchema.java b/examples/src/main/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchema.java index 9d55b38be..84483d1b3 100644 --- a/examples/src/main/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchema.java +++ b/examples/src/main/java/edu/pdx/cs/joy/jdbc/PrintH2DatabaseSchema.java @@ -195,9 +195,8 @@ private static void printIndexes(DatabaseMetaData metaData, String tableName) th * Main method that takes a database file path and prints the schema. * * @param args command line arguments where args[0] is the path to the H2 database file - * @throws SQLException if a database error occurs */ - public static void main(String[] args) throws SQLException { + public static void main(String[] args) { if (args.length < 1) { System.err.println("Missing database file path argument"); System.err.println("Usage: java PrintH2DatabaseSchema "); @@ -212,6 +211,8 @@ public static void main(String[] args) throws SQLException { try (Connection connection = H2DatabaseHelper.createFileBasedConnection(dbFile)) { printDatabaseSchema(connection); + } catch (SQLException ex) { + System.err.println("Error: " + ex.getMessage()); } } }