Udostępnij za pośrednictwem


Obsługa błędów w usłudze Azure Databricks

Dotyczy: zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 12.2 i nowsze

Składniki błędu

Gdy usługa Azure Databricks zgłasza błąd, zawiera następujące składniki:

  • Error, klasa

    Opisowy, czytelny dla człowieka ciąg unikatowy dla warunku błędu.

    Niektóre klasy błędów obejmują podlasy.

    Na przykład: TABLE_OR_VIEW_NOT_FOUND i INCOMPLETE_TYPE_DEFINITION. TABLICA.

    Aby uzyskać listę wszystkich klas błędów, zobacz Klasy błędów.

  • SQLSTATE

    Pięć znaków długi ciąg, grupowanie klas błędów w standardowym formacie obsługiwanym przez wiele produktów i interfejsów API.

    Na przykład: '42P01'.

    Aby uzyskać pełną listę wszystkich SQLSTATEelementów używanych przez usługę Azure Databricks, zobacz SQLSTATEs.

  • Komunikat sparametryzowany

    Komunikat o błędzie z symbolami zastępczymi parametrów.

    Na przykład: TABLE_OR_VIEW_NOT_FOUND zawiera następujący komunikat:

    The table or view <relationName> cannot be found.
    

    Możesz użyć sparametryzowanego komunikatu, aby renderować komunikat o błędzie, mapując wartości parametrów komunikatu na tagi parametrów <parameter>.

  • Parametry komunikatu

    Mapa parametrów i wartości, które zawierają dodatkowe informacje o błędzie. Na przykład: 'relationName' -> 'main.default.tab1'.

  • Wiadomość

    W pełni renderowany komunikat o błędzie, w tym klasa błędów i SQLSTATEparametr , z wypełnionymi parametrami. Na przykład:

    [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
    

Ostrzeżenie

Komunikat i komunikat sparametryzowany nie są stabilne w wersjach. Tekst wiadomości może zostać zmieniony lub zlokalizowany bez powiadomienia. Aby programowo obsłużyć warunek błędu, zamiast tego użyj klasy błędów, SQLSTATEi parametrów komunikatów .

Obsługa warunków błędów

Dotyczy: zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime 14.2 i nowsze

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej.

Usługa Azure Databricks udostępnia interfejsy API specyficzne dla języka do obsługi warunków błędów.

Python

W przypadku języka Python użyj elementu pySparkException

  • PySparkException.getErrorClass(): zwraca klasę błędów wyjątku jako ciąg.
  • PySparkException.getMessageParameters(): zwraca parametry komunikatu wyjątku jako słownika.
  • PySparkException.getSqlState(): zwraca SQLSTATE wyrażenie jako ciąg.

Scala

W przypadku języka Scala użyj elementu SparkThrowable

  • getErrorClass(): zwraca klasę błędów jako ciąg.
  • getMessageParameters(): zwraca parametry komunikatu jako mapę.
  • getSqlState(): zwraca wartość SQLSTATE jako ciąg.

Przykłady

  • Przechwyć wszelkie wyjątki i wyświetlić klasę błędów, parametry komunikatu i SQLSTATE. Wyświetl również domyślny komunikat o błędzie

    Scala

    import org.apache.spark.SparkThrowable
    
    try {
      spark.sql("SELECT * FROM does_not_exist").show()
    }
    catch {
      case ex: SparkThrowable =>
        println("Error Class       : " + ex.getErrorClass)
        println("Message parameters: " + 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 Class       : " + ex.getErrorClass())
      print("Message parameters: " + str(ex.getMessageParameters()))
      print("SQLSTATE          : " + ex.getSqlState())
      print(ex)
    

    Result

      Error Class       : TABLE_OR_VIEW_NOT_FOUND
      Message parameters: {'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
    
  • Przechwyć tylko sqlSTATE 42P01 i wyświetlić niestandardowy komunikat:

    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
    

    Result

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • Przechwyć tylko klasę TABLE_OR_VIEW_NOT_FOUND błędów i wyświetlić niestandardowy komunikat:

    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
    

    Result

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

Użytkownik zgłosił wyjątki

Usługa Azure Databricks udostępnia następujące funkcje umożliwiające zgłaszanie błędów zdefiniowanych przez użytkownika:

  • raise_error

    Zgłasza wyjątek z niestandardowym komunikatem o błędzie.

  • assert_true

    Zgłasza błąd z opcjonalnym komunikatem o błędzie, jeśli warunek nie jest spełniony.

Obie funkcje zwracają klasę błędów "USER_RAISED_EXCEPTION" oraz SQLSTATE 'P0001' komunikat zdefiniowany przez użytkownika.

Przykłady

> 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