Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:
Databricks SQL
Databricks Runtime 12.2 и более поздних версий
Компоненты ошибок
Когда Azure Databricks вызывает ошибку, она включает следующие компоненты:
-
Описательная, читаемая человеком строка, уникальная для условия ошибки.
Некоторые условия ошибки включают подкондиции.
Например, TABLE_OR_VIEW_NOT_FOUND и INCOMPLETE_TYPE_DEFINITION.МАССИВ.
Список всех условий ошибки см. в разделе "Условия ошибки".
-
Пятизначная длинная строка, группирование условий ошибки в стандартный формат, поддерживаемый многими продуктами и API.
Например:
'42P01'Полный список всех
SQLSTATE, которые использует Azure Databricks, смотрите в разделе SQLSTATEs. Параметризованное сообщение
Сообщение об ошибке с заполнителями для параметров.
Например: TABLE_OR_VIEW_NOT_FOUND содержит следующее сообщение:
The table or view <relationName> cannot be found.Параметризованное сообщение можно использовать для отображения сообщения об ошибке путем сопоставления значений параметров сообщения с тегами параметров
<parameter>.Параметры сообщения
Карта параметров и значений, которые предоставляют дополнительные сведения об ошибке. Например:
'relationName' -> 'main.default.tab1'.Сообщение
Полностью отрисованное сообщение об ошибке, включая условие ошибки и
SQLSTATE, с параметрами, заполненными. Например:[TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog. If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog. To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14; 'Project [*] +- 'UnresolvedRelation [does_not_exist], [], false
Предупреждение
Сообщение и параметризованное сообщение не являются стабильными в разных выпусках.
Текст сообщения может быть изменен или локализован без уведомления.
Для программной обработки условия ошибки используйте условие ошибкиSQLSTATE и параметры сообщения.
Обработка условий ошибок
Область применения:
Databricks SQL
Databricks Runtime 14.2 и выше
Внимание
Эта функция предоставляется в режиме общедоступной предварительной версии.
Azure Databricks предоставляет интерфейсы API, специфичные для языка, для обработки ошибок.
SQL
Область применения:
для Databricks SQL
для Databricks Runtime 16.3 и более поздних версий
Для SQL используется синтаксис составной инструкции для определения обработчиков условий.
-
DECLARE EXIT HANDLER: определяет обработчик для набора указанных условий ошибки,
SQLSTATEили любогоSQLEXCEPTION. -
GET ДИАГНОСТИКА: извлекает условие ошибки и параметры сообщения условия ошибки,
SQLSTATEперехваченного обработчиком.
Питон
Для Python используется pySparkException
-
PySparkException.getErrorClass(): возвращает условие ошибки исключения в виде строки. -
PySparkException.getMessageParameters(): возвращает параметры сообщения исключения в виде словаря. -
PySparkException.getSqlState(): возвращаетSQLSTATEвыражение в виде строки.
язык программирования Scala
Для Scala используйте SparkThrowable
-
getErrorClass(): возвращает условие ошибки в виде строки. -
getMessageParameters(): возвращает параметры сообщения в виде карты. -
getSqlState(): возвращаетSQLSTATEв виде строки.
Примеры
Перехват любого исключения и отображение условия ошибки, параметров сообщения и
SQLSTATE. Также отображается сообщение об ошибке по умолчаниюSQL
BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN DECLARE error_condition STRING; DECLARE sqlstate STRING; DECLARE msg_args MAP<STRING, STRING>; DECLARE msg STRING; GET DIAGNOSTICS CONDITION 1 error_condition = CONDITION_IDENTIFIER, sqlstate = RETURNED_SQLSTATE, msg_args = MESSAGE_ARGUMENTS, msg = MESSAGE_TEXT; VALUES('Error Condition : ' || error_condition ), ('Message arguments : ' || cast(msg_args AS STRING)), ('SQLSTATE : ' || sqlstate ), (msg ); END; SELECT * FROM does_not_exist; END;язык программирования Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable => println("Error Condition : " + ex.getErrorClass) println("Message arguments : " + ex.getMessageParameters()) println("SQLSTATE : " + ex.getSqlState) println(ex) }Питон
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: print("Error Condition : " + ex.getErrorClass()) print("Message arguments : " + str(ex.getMessageParameters())) print("SQLSTATE : " + ex.getSqlState()) print(ex)Результат
Error Condition : TABLE_OR_VIEW_NOT_FOUND Message arguments : {'relationName': '`does_not_exist`'} SQLSTATE : 42P01 [TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog. If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog. To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14; 'Project [*] +- 'UnresolvedRelation [does_not_exist], [], falseПерехватите только SQLSTATE
42P01и отобразите пользовательское сообщение:SQL
BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '42P01' BEGIN DECLARE msg_args MAP<STRING, STRING>; GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS; VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']); END; SELECT * FROM does_not_exist; END;язык программирования Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable if (ex.getSqlState == "42P01") => println("I'm so sorry, but I cannot find: " + ex.getMessageParameters().get("relationName")) }Питон
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: if (ex.getSqlState() == "42P01"): print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName']) else: raiseРезультат
I'm so sorry, but I cannot find: `does_not_exist`Перехватите только условие ошибки
TABLE_OR_VIEW_NOT_FOUNDи отобразите настраиваемое сообщение.SQL
BEGIN DECLARE EXIT HANDLER FOR TABLE_OR_VIEW_NOT_FOUND BEGIN DECLARE msg_args MAP<STRING, STRING>; GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS; VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']); END; SELECT * FROM does_not_exist; END;язык программирования Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable if (ex.getErrorClass == "TABLE_OR_VIEW_NOT_FOUND") => println("I'm so sorry, but I cannot find: " + ex.getMessageParameters().get("relationName")) }Питон
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: if (ex.getErrorClass() == "TABLE_OR_VIEW_NOT_FOUND"): print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName']) else: raiseРезультат
I'm so sorry, but I cannot find: `does_not_exist`
Исключения, вызванные пользователем
Azure Databricks предоставляет следующие функции для создания определяемых пользователем ошибок:
-
Вызывает исключение с пользовательским сообщением об ошибке.
-
Вызывает ошибку с необязательным сообщением об ошибке, если условие не выполнено.
Обе функции возвращают условие ошибки "USER_RAISED_EXCEPTION" и SQLSTATE'P0001' наряду с определяемым пользователем сообщением.
Примеры
> SELECT raise_error('This is a custom error message');
[USER_RAISED_EXCEPTION] This is a custom error message. SQLSTATE: P0001
> SELECT assert_true(1 = 2, 'One is not two!');
[USER_RAISED_EXCEPTION] One is not two! SQLSTATE: P0001
> SELECT assert_true(1 = 2);
[USER_RAISED_EXCEPTION] '(1 = 2)' is not true! SQLSTATE: P0001