Sdílet prostřednictvím


Zpracování chyb v Azure Databricks

Platí pro:zaškrtnuto ano Databricks SQL zaškrtnuto ano Databricks Runtime 12.2 a vyšší

Součásti chyb

Když Azure Databricks vyvolá chybu, obsahuje následující komponenty:

  • Chybový stav

    Popisný, čitelný řetězec, který je jedinečný pro chybový stav.

    Mezi chybové podmínky patří podmíněné situace.

    Příklad: TABLE_OR_VIEW_NOT_FOUND a INCOMPLETE_TYPE_DEFINITION.ARRAY.

    Seznam všech chybových podmínek naleznete v části Chybové podmínky.

  • SQLSTATE

    Pětimístný řetězec, seskupování chybových podmínek do standardního formátu podporovaného mnoha produkty a rozhraními API.

    Příklad: '42P01'

    Úplný seznam všech SQLSTATEpoložek používaných službou Azure Databricks najdete v tématu SQLSTATEs.

  • Parametrizovaná zpráva

    Chybová zpráva se zástupnými symboly parametrů.

    Například: TABLE_OR_VIEW_NOT_FOUND obsahuje následující zprávu:

    The table or view <relationName> cannot be found.
    

    Parametrizovanou zprávu můžete použít k vykreslení chybové zprávy mapováním hodnot parametrů zprávy na značky <parameter> parametrů.

  • Parametry zprávy

    Mapa parametrů a hodnot, které poskytují další informace o chybě. Například: 'relationName' -> 'main.default.tab1'.

  • Zpráva

    Kompletně vykreslená chybová zpráva, včetně chybového stavu a parametru SQLSTATE, s vyplněnými parametry. Příklad:

    [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
    

Varování

Message a Parameterized Message nejsou stabilní mezi jednotlivými verzemi. Text zprávy se může změnit nebo lokalizovat bez předchozího upozornění. Pokud chcete programově zpracovat chybový stav, použijte místo toho chybovou podmínkuSQLSTATE a parametry zprávy.

Zpracování chybových podmínek

Platí pro: Kontrola označená jako ano Kontrola SQL Databricks označená jako ano Databricks Runtime 14.2 a vyšší

Důležité

Tato funkce je ve verzi Public Preview.

Azure Databricks poskytuje rozhraní API specifická pro jazyk pro zpracování chybových podmínek.

SQL

Platí pro: zaškrtnuto ano Databricks SQL zaškrtnuto ano Databricks Runtime 16.3 a vyšší

Pro SQL použijte syntaxi složeného příkazu k definování obslužných rutin podmínek.

  • DEKLARUJTE OBSLUŽNOU RUTINu EXIT: Definuje obslužnou rutinu pro sadu zadaných chybových podmínek, SQLSTATEs nebo jakékoli SQLEXCEPTION.
  • GET DIAGNOSTIKA: Načte chybovou podmínku SQLSTATEa parametry zprávy chybové podmínky zachycené obslužnou rutinou.

Python

Pro Python použijte pySparkException.

  • PySparkException.getErrorClass(): Vrátí chybovou podmínku výjimky jako řetězec.
  • PySparkException.getMessageParameters(): Vrátí parametry zprávy výjimky ve formě slovníku.
  • PySparkException.getSqlState(): Vrátí výraz SQLSTATE jako řetězec.

Scala

Pro Scala použijte SparkThrowable

  • getErrorClass(): Vrátí chybovou podmínku jako řetězec.
  • getMessageParameters(): Vrátí parametry zprávy jako mapu.
  • getSqlState(): Vrátí SQLSTATE jako řetězec.

Příklady

  • Zachyťte všechny výjimky a zobrazte chybovou podmínku, parametry zprávy a SQLSTATE. Zobrazí se také výchozí chybová zpráva.

    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)
    

    Výsledek

      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
    
  • Zachyťte pouze SQLSTATE 42P01 a zobrazte vlastní zprávu:

    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
    

    Výsledek

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • Zachyťte pouze chybový stav TABLE_OR_VIEW_NOT_FOUND a zobrazte vlastní zprávu:

    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
    

    Výsledek

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

Výjimky vyvolané uživatelem

Azure Databricks poskytuje následující funkce pro vyvolání chyb definovaných uživatelem:

  • vyvolat_chybu

    Vyvolá výjimku s vlastní, přizpůsobenou chybovou zprávou.

  • assert_true

    Vyvolá chybu s volitelnou chybovou zprávou, pokud není splněna podmínka.

Obě funkce vrací chybovou podmínku "USER_RAISED_EXCEPTION" a SQLSTATE'P0001' společně se zprávou definovanou uživatelem.

Příklady

> 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