Felhantering i Azure Databricks

Gäller för: markerad ja Databricks SQL markerad ja Databricks Runtime 12.2 och senare

Felkomponenter

När Azure Databricks genererar ett fel innehåller det följande komponenter:

  • Felklass

    En beskrivande, läsbar sträng som är unik för felvillkoret.

    Vissa felklasser omfattar underpunkter.

    Till exempel: TABLE_OR_VIEW_NOT_FOUND och INCOMPLETE_TYPE_DEFINITION. MATRIS.

    En lista över alla felklasser finns i Felklasser.

  • SQLSTATE

    En fem tecken lång sträng som grupperar felklasser i ett standardformat som stöds av många produkter och API:er.

    Till exempel: '42P01'

    En fullständig lista över alla SQLSTATEsom används av Azure Databricks finns i SQLSTATEs.

  • Parameteriserat meddelande

    Felmeddelandet med platshållare för parametrarna.

    Exempel: TABLE_OR_VIEW_NOT_FOUND innehåller följande meddelande:

    The table or view <relationName> cannot be found.
    

    Du kan använda det parametriserade meddelandet för att återge ett felmeddelande genom att mappa parametervärden för meddelanden till parametertaggar <parameter>.

  • Meddelandeparametrar

    En karta över parametrar och värden som ger ytterligare information om felet. Exempel: 'relationName' -> 'main.default.tab1'.

  • Meddelande

    Det fullständigt renderade felmeddelandet, inklusive felklassen SQLSTATEoch , med parametrarna ifyllda. Till exempel:

    [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
    

Varning

Meddelandet och det parametriserade meddelandet är inte stabila i olika versioner. Meddelandetexten kan ändras eller lokaliseras utan föregående meddelande. Om du vill hantera ett feltillstånd programmatiskt använder du felklassen , SQLSTATEoch meddelandeparametrar i stället.

Hantera feltillstånd

Gäller för: markerad ja Databricks SQL markerad ja Databricks Runtime 14.2 och senare

Viktigt!

Den här funktionen finns som allmänt tillgänglig förhandsversion.

Azure Databricks tillhandahåller språkspecifika API:er för att hantera feltillstånd.

Python

För Python använder du pySparkException

  • PySparkException.getErrorClass(): Returnerar felklassen för undantaget som en sträng.
  • PySparkException.getMessageParameters(): Returnerar meddelandeparametrarna för undantaget som en ordlista.
  • PySparkException.getSqlState(): Returnerar SQLSTATE uttrycket som en sträng.

Scala

För Scala använder du SparkThrowable

  • getErrorClass(): Returnerar en felklass som en sträng.
  • getMessageParameters(): Returnerar en meddelandeparametrar som en karta.
  • getSqlState(): Returnerar en SQLSTATE som en sträng.

Exempel

  • Fånga eventuella undantags- och visningsfelklasser, meddelandeparametrar och SQLSTATE. Visa även standardfelmeddelandet

    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
    
  • Fånga endast SQLSTATE 42P01 och visa ett anpassat meddelande:

    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`
    
  • Fånga endast felklassen TABLE_OR_VIEW_NOT_FOUND och visa ett anpassat meddelande:

    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`
    

Användarinsamlade undantag

Azure Databricks tillhandahåller följande funktioner för att skapa användardefinierade fel:

  • raise_error

    Genererar ett undantag med ett anpassat felmeddelande.

  • assert_true

    Genererar ett fel med ett valfritt felmeddelande om ett villkor inte uppfylls.

Båda funktionerna returnerar felklassen "USER_RAISED_EXCEPTION" och SQLSTATE 'P0001' tillsammans med ett användardefinierat meddelande.

Exempel

> 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