Repository: dbt-labs/dbt-core
Issue: Weird error messages on 0.14.2 && Snowflake

### Describe the bug
I keep getting weird error messages when I `dbt compile` or `dbt docs generate`. dbt is right -- these objects don't exist, but it isn't handling the errors well.
```
$ dbt compile
Running with dbt=0.14.2
Found 106 models, 71 tests, 1 snapshot, 0 analyses, 275 macros, 1 operation, 6 seed files, 23 sources

16:17:21 | Concurrency: 8 threads (target='dev')
16:17:21 |
Unhandled error while executing model.fishtown_internal_analytics.stg_dbt_invocation_env_contexts
connection never acquired for thread (52969, 123145499398144), have []
Unhandled error while executing model.fishtown_internal_analytics.stg_snowplow_web_page_contexts
connection never acquired for thread (52969, 123145504653312), have []
Unhandled error while executing model.fishtown_internal_analytics.stg_dbt_invocation_contexts
connection never acquired for thread (52969, 123145473122304), have []
Unhandled error while executing model.fishtown_internal_analytics.stg_dbt_platform_contexts
connection never acquired for thread (52969, 123145467867136), have []
Unhandled error while executing model.fishtown_internal_analytics.stg_dbt_run_model_contexts
connection never acquired for thread (52969, 123145483632640), have []
Unhandled error while executing model.fishtown_internal_analytics.stg_snowplow_events
'AttributeError' object has no attribute 'msg'
Encountered an error:
Runtime Error
  Database Error in model fct_opportunities (models/marts/sales/fct_opportunities.sql)
    002003 (42S02): 018f53e1-03a9-fa7b-0000-0e69039ebcee: SQL compilation error:
    Object 'ANALYTICS.DBT_CLAIRE.STG_CLOSE_CUSTOM_FIELDS' does not exist.
```
### System information
**Which database are you using dbt with?**
- snowflake

**The output of `dbt debug`:**
```
Running with dbt=0.14.2
dbt version: 0.14.2
python version: 3.7.4
python path: /usr/local/Cellar/dbt@0.14.2/0.14.2_3/libexec/bin/python3.7
os info: Darwin-18.7.0-x86_64-i386-64bit
Using profiles.yml file at /Users/claire/.dbt/profiles.yml

Configuration:
  profiles.yml file [OK found and valid]
  dbt_project.yml file [OK found and valid]
  profile: garage-snowflake [OK found]
  target: dev [OK found]

Required dependencies:
 - git [OK found]
```

### Additional context
Logs sent via Slack (too long for here)

Changed files:
plugins/postgres/dbt/adapters/postgres/connections.py, core/dbt/exceptions.py, core/dbt/adapters/base/connections.py, plugins/bigquery/dbt/adapters/bigquery/connections.py, core/dbt/adapters/base/impl.py, plugins/snowflake/dbt/adapters/snowflake/connections.py

diff --git a/core/dbt/adapters/base/connections.py b/core/dbt/adapters/base/connections.py
index d72409229..cfee29cda 100644
--- a/core/dbt/adapters/base/connections.py
+++ b/core/dbt/adapters/base/connections.py
@@ -46,9 +46,8 @@ class BaseConnectionManager(metaclass=abc.ABCMeta):
         key = self.get_thread_identifier()
         with self.lock:
             if key not in self.thread_connections:
-                raise RuntimeError(
-                    'connection never acquired for thread {}, have {}'
-                    .format(key, list(self.thread_connections))
+                raise dbt.exceptions.InvalidConnectionException(
+                    key, list(self.thread_connections)
                 )
             return self.thread_connections[key]
 
diff --git a/core/dbt/adapters/base/impl.py b/core/dbt/adapters/base/impl.py
index 84574874a..30b20c25d 100644
--- a/core/dbt/adapters/base/impl.py
+++ b/core/dbt/adapters/base/impl.py
@@ -219,7 +219,7 @@ class BaseAdapter(metaclass=AdapterMeta):
         return self.connections.commit_if_has_connection()
 
     def nice_connection_name(self):
-        conn = self.connections.get_thread_connection()
+        conn = self.connections.get_if_exists()
         if conn is None or conn.name is None:
             return '<None>'
         return conn.name
diff --git a/core/dbt/exceptions.py b/core/dbt/exceptions.py
index 9b3462ca3..bc048ae00 100644
--- a/core/dbt/exceptions.py
+++ b/core/dbt/exceptions.py
@@ -338,6 +338,16 @@ class CommandResultError(CommandError):
         return '{} running: {}'.format(self.msg, self.cmd)
 
 
+class InvalidConnectionException(RuntimeException):
+    def __init__(self, thread_id, known, node=None):
+        self.thread_id = thread_id
+        self.known = known
+        super().__init__(
+            msg='connection never acquired for thread {}, have {}'
+            .format(self.thread_id, self.known)
+        )
+
+
 def raise_compiler_error(msg, node=None) -> NoReturn:
     raise CompilationException(msg, node)
 
diff --git a/plugins/bigquery/dbt/adapters/bigquery/connections.py b/plugins/bigquery/dbt/adapters/bigquery/connections.py
index b1bf8b44e..7c9251cff 100644
--- a/plugins/bigquery/dbt/adapters/bigquery/connections.py
+++ b/plugins/bigquery/dbt/adapters/bigquery/connections.py
@@ -64,7 +64,7 @@ class BigQueryConnectionManager(BaseConnectionManager):
         error_msg = "\\n".join(
             [item['message'] for item in error.errors])
 
-        raise dbt.exceptions.DatabaseException(error_msg)
+        raise dbt.exceptions.DatabaseException(error_msg) from error
 
     def clear_transaction(self):
         pass
@@ -90,7 +90,7 @@ class BigQueryConnectionManager(BaseConnectionManager):
                 # this sounds a lot like a signal handler and probably has
                 # useful information, so raise it without modification.
                 raise
-            raise dbt.exceptions.RuntimeException(str(e))
+            raise dbt.exceptions.RuntimeException(str(e)) from e
 
     def cancel_open(self) -> None:
         pass
diff --git a/plugins/postgres/dbt/adapters/postgres/connections.py b/plugins/postgres/dbt/adapters/postgres/connections.py
index 15d68de00..decfff0e5 100644
--- a/plugins/postgres/dbt/adapters/postgres/connections.py
+++ b/plugins/postgres/dbt/adapters/postgres/connections.py
@@ -52,7 +52,7 @@ class PostgresConnectionManager(SQLConnectionManager):
                 logger.debug("Failed to release connection!")
                 pass
 
-            raise dbt.exceptions.DatabaseException(str(e).strip())
+            raise dbt.exceptions.DatabaseException(str(e).strip()) from e
 
         except Exception as e:
             logger.debug("Error running SQL: {}", sql)
@@ -64,7 +64,7 @@ class PostgresConnectionManager(SQLConnectionManager):
                 # useful information, so raise it without modification.
                 raise
 
-            raise dbt.exceptions.RuntimeException(e)
+            raise dbt.exceptions.RuntimeException(e) from e
 
     @classmethod
     def open(cls, connection):
diff --git a/plugins/snowflake/dbt/adapters/snowflake/connections.py b/plugins/snowflake/dbt/adapters/snowflake/connections.py
index ddb49992d..9aa06cca0 100644
--- a/plugins/snowflake/dbt/adapters/snowflake/connections.py
+++ b/plugins/snowflake/dbt/adapters/snowflake/connections.py
@@ -99,7 +99,7 @@ class SnowflakeConnectionManager(SQLConnectionManager):
                 # this sounds a lot like a signal handler and probably has
                 # useful information, so raise it without modification.
                 raise
-            raise dbt.exceptions.RuntimeException(e.msg)
+            raise dbt.exceptions.RuntimeException(str(e)) from e
 
     @classmethod
     def open(cls, connection):