Other than harder to read, this approach is easier to have side effect, consider the following case:
    // Code which fail
    public String service() { 
        try {
	// a lot of other code....	
            return getRecord();
        } catch (SQLException re) {
            return "defaultRecord";
        }
    }

    private String getRecord() throws SQLException {
        PreparedStatement ps = getConnection().prepareStatement("select something from sometable");
        try {
            final ResultSet rs = ps.executeQuery();
            try {
                if (rs.next())
                    return rs.getString(1);
                else
                    throw new NotFoundException();
            } finally {
                rs.close();
            }
        } finally {
            ps.close();
        }

        // definition of NotFoundException, analog to IOException and FileNotFoundException
        public final class NotFoundException extends SQLException {....}
The idea is, for any database problem, just return default value. However, if someone change the interface of NotFoundException to public final class NotFoundException extends RuntimeException {....} Then it break service() silencely :-/ Some to it is better to have
    // Code which fail
    public String service() {
        try {
        // a lot of other code....
            return getRecord() == null ? "defaultRecord" : getRecord();
        } catch (SQLException re) {
	// proper exception handling
        }
    }

    private String getRecord() throws SQLException {
        PreparedStatement ps = getConnection().prepareStatement("select something from sometable");
        try {
            final ResultSet rs = ps.executeQuery();
            try {
                if (rs.next())
                    return rs.getString(1);
                else
                    return null;
            } finally {
                rs.close();
            }
        } finally {
            ps.close();
        }