Teilen über


Fehlerbehandlung in Azure Databricks

Gilt für:Häkchen gesetzt ja Databricks SQL Häkchen gesetzt ja Databricks Runtime 12.2 und höher

Fehlerkomponenten

Wenn Azure Databricks einen Fehler auslöst, enthält er die folgenden Komponenten:

  • Fehlerzustand

    Eine beschreibende, lesbare Zeichenfolge, die für die Fehlerbedingung eindeutig ist

    Einige Fehlerbedingungen umfassen Unterbedingungen.

    Beispiel: TABLE_OR_VIEW_NOT_FOUND und INCOMPLETE_TYPE_DEFINITION. ARRAY.

    Eine Liste aller Fehlerbedingungen finden Sie unter "Fehlerbedingungen".

  • SQLSTATE

    Eine fünf Zeichen lange Zeichenfolge, die Fehlerbedingungen in einem Standardformat gruppiert, das von vielen Produkten und APIs unterstützt wird.

    Beispiel: '42P01'

    Eine vollständige Liste aller von Azure Databricks verwendeten SQLSTATE-Werte finden Sie unter SQLSTATE-Codes.

  • Parametrisierte Meldung

    Die Fehlermeldung mit Platzhaltern für die Parameter

    Beispiel: TABLE_OR_VIEW_NOT_FOUND enthält die folgende Meldung:

    The table or view <relationName> cannot be found.
    

    Sie können die parametrisierte Nachricht verwenden, um eine Fehlermeldung zu rendern, indem Sie Meldungsparameter den Parametertags <parameter> zuordnen.

  • Meldungsparameter

    Eine Zuordnung von Parametern und Werten, die zusätzliche Informationen zum Fehler bereitstellen. Beispiel: 'relationName' -> 'main.default.tab1'

  • Meldung

    Die vollständig gerenderte Fehlermeldung, einschließlich der Fehlerbedingung und der SQLSTATE, mit den ausgefüllten Parametern. Beispiel:

    [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
    

Warnung

Meldung und Parametrisierte Meldung sind nicht über Versionen hinweg stabil. Der Meldungstext kann ohne Ankündigung geändert oder lokalisiert werden. Um eine Fehlerbedingung programmgesteuert zu behandeln, verwenden Sie stattdessen die Fehlerbedingung, SQLSTATEund die Meldungsparameter .

Behandeln von Fehlerbedingungen

Gilt für: Häkchen ja Databricks SQL durch Häkchen mit „Ja“ markiert Databricks Runtime 14.2 und höher

Wichtig

Dieses Feature befindet sich in der Public Preview.

Azure Databricks stellt sprachspezifische APIs zur Behandlung von Fehlerbedingungen bereit.

SQL

Gilt für: Häkchen für „Ja“ Databricks SQL Häkchen für „Ja“ Databricks Runtime 16.3 und höher

Verwenden Sie für SQL die Syntax der zusammengesetzten Anweisung zum Definieren von Bedingungshandlern.

  • DECLARE EXIT HANDLER: Definiert einen Handler für eine Reihe angegebener Fehlerbedingungen, SQLSTATE-Zustände oder eine beliebige SQLEXCEPTION-Ausnahme.
  • GET DIAGNOSE: Ruft die Fehlerbedingung, SQLSTATEund die Meldungsparameter der vom Handler abgefangenen Fehlerbedingung ab.

Python

Verwenden Sie für Python pySparkException.

  • PySparkException.getErrorClass(): Gibt die Fehlerbedingung der Ausnahme als Zeichenfolge zurück.
  • PySparkException.getMessageParameters(): Gibt die Meldungsparameter der Ausnahme als Wörterbuch zurück.
  • PySparkException.getSqlState(): Gibt den SQLSTATE-Wert der Ausnahme als Zeichenfolge zurück.

Scala

Verwenden Sie für Scala SparkThrowable.

  • getErrorClass(): Gibt eine Fehlerbedingung als Zeichenfolge zurück.
  • getMessageParameters(): Gibt einen Meldungsparameter als Zuordnung zurück.
  • getSqlState(): Gibt ein SQLSTATE als Zeichenfolge zurück.

Beispiele

  • Erfassen Sie alle Ausnahmen und Anzeigefehlerbedingungen, Meldungsparameter und SQLSTATE-Werte. Zeigen Sie außerdem die Standardfehlermeldung an.

    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)
    }
    

    Python

    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)
    

    Ergebnis

      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
    
  • Erfassen Sie nur den SQLSTATE-Wert 42P01, und zeigen Sie eine benutzerdefinierte Meldung an:

    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"))
    }
    

    Python

    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
    

    Ergebnis

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • Erfassen Sie die Fehlerbedingung TABLE_OR_VIEW_NOT_FOUND nur, und zeigen Sie eine benutzerdefinierte Meldung an:

    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"))
    }
    

    Python

    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
    

    Ergebnis

    I'm so sorry, but I cannot find: `does_not_exist`
    

Von Benutzer*innen ausgelöste Ausnahmen

Azure Databricks bietet die folgenden Funktionen zum Auslösen von benutzerdefinierten Fehlern:

  • raise_error

    Löst eine Ausnahme mit einer benutzerdefinierten Fehlermeldung aus.

  • assert_true

    Löst einen Fehler mit einer optionalen Fehlermeldung aus, wenn eine Bedingung nicht erfüllt wird.

Beide Funktionen geben die Fehlerbedingung "USER_RAISED_EXCEPTION" und die SQLSTATE'P0001' zusammen mit einer benutzerdefinierten Nachricht zurück.

Beispiele

> 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