From 00da8223792cc5fca022c4248d55a2074d630bc0 Mon Sep 17 00:00:00 2001 From: Yongjie Zhao Date: Thu, 16 Sep 2021 13:19:39 +0800 Subject: [PATCH] fix: catch exception when create connection --- superset/db_engine_specs/bigquery.py | 10 +++++++++- superset/models/core.py | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/superset/db_engine_specs/bigquery.py b/superset/db_engine_specs/bigquery.py index 734984499fcea..88c5e5964a9a9 100644 --- a/superset/db_engine_specs/bigquery.py +++ b/superset/db_engine_specs/bigquery.py @@ -17,7 +17,7 @@ import re import urllib from datetime import datetime -from typing import Any, Dict, List, Optional, Pattern, Tuple, TYPE_CHECKING +from typing import Any, Dict, List, Optional, Pattern, Tuple, Type, TYPE_CHECKING import pandas as pd from apispec import APISpec @@ -32,6 +32,7 @@ from superset.databases.schemas import encrypted_field_properties, EncryptedField from superset.db_engine_specs.base import BaseEngineSpec +from superset.db_engine_specs.exceptions import SupersetDBAPIDisconnectionError from superset.errors import SupersetError, SupersetErrorType from superset.sql_parse import Table from superset.utils import core as utils @@ -388,6 +389,13 @@ def get_parameters_from_uri( raise ValidationError("Invalid service credentials") + @classmethod + def get_dbapi_exception_mapping(cls) -> Dict[Type[Exception], Type[Exception]]: + # pylint: disable=import-outside-toplevel + from google.auth.exceptions import DefaultCredentialsError + + return {DefaultCredentialsError: SupersetDBAPIDisconnectionError} + @classmethod def validate_parameters( cls, parameters: BigQueryParametersType # pylint: disable=unused-argument diff --git a/superset/models/core.py b/superset/models/core.py index 129923b05ccf6..fd8684143a078 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -372,7 +372,10 @@ def get_sqla_engine( sqlalchemy_url, params, effective_username, security_manager, source ) - return create_engine(sqlalchemy_url, **params) + try: + return create_engine(sqlalchemy_url, **params) + except Exception as ex: + raise self.db_engine_spec.get_dbapi_mapped_exception(ex) def get_reserved_words(self) -> Set[str]: return self.get_dialect().preparer.reserved_words