Bagikan melalui


Penanganan kesalahan di Azure Databricks

Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 12.2 ke atas

Komponen kesalahan

Saat Azure Databricks menimbulkan kesalahan, azure Databricks menyertakan komponen berikut:

  • Kondisi Kesalahan

    String deskriptif yang dapat dibaca manusia dan unik untuk kondisi kesalahan.

    Beberapa kondisi kesalahan mengandung subkondisi.

    Misalnya: TABLE_OR_VIEW_NOT_FOUND, dan INCOMPLETE_TYPE_DEFINITION.ARRAY.

    Untuk daftar semua kondisi kesalahan, lihat Kondisi Kesalahan.

  • SQLSTATE

    String panjang lima karakter, mengelompokkan kondisi kesalahan ke dalam format standar yang didukung oleh banyak produk dan API.

    Misalnya: '42P01'

    Untuk daftar lengkap semua SQLSTATEs yang digunakan oleh Azure Databricks lihat SQLSTATEs.

  • Pesan Berparameter

    Pesan galat dengan placeholder untuk parameter.

    Misalnya : TABLE_OR_VIEW_NOT_FOUND menyertakan pesan berikut:

    The table or view <relationName> cannot be found.
    

    Anda dapat menggunakan pesan yang memiliki parameter untuk menampilkan pesan kesalahan dengan memetakan nilai parameter pesan ke tag parameter <parameter>.

  • Parameter Pesan

    Peta parameter dan nilai yang memberikan informasi tambahan tentang kesalahan. Misalnya: 'relationName' -> 'main.default.tab1'.

  • Pesan

    Pesan kesalahan yang dirender sepenuhnya, termasuk kondisi kesalahan dan SQLSTATE, dengan parameter yang diisi. Contohnya:

    [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
    

Peringatan

Pesan dan Pesan Berparameter tidak stabil di seluruh rilis. Teks pesan dapat diubah atau dilokalkan tanpa pemberitahuan. Untuk menangani kondisi kesalahan secara terprogram, gunakan Parameter Kondisi Kesalahan, SQLSTATE, dan Pesan sebagai gantinya.

Menangani kondisi kesalahan

Berlaku untuk: centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 14.2 ke atas

Penting

Fitur ini ada di Pratinjau Publik.

Azure Databricks menyediakan API khusus bahasa untuk menangani kondisi kesalahan.

SQL

Berlaku untuk: dengan tanda centang ya Databricks SQL dengan tanda centang ya Databricks Runtime 16.3 atau lebih

Untuk SQL, gunakan sintaks pernyataan majemuk untuk menentukan penangan kondisi.

  • DECLARE EXIT HANDLER: Mendefinisikan handler untuk serangkaian kondisi kesalahan tertentu, SQLSTATEs, atau apa pun SQLEXCEPTION.
  • GET DIAGNOSTIK: Mengambil kondisi kesalahan, SQLSTATE, dan parameter pesan dari kondisi kesalahan yang disadap oleh handler.

Phyton

Untuk Python gunakan pySparkException

  • PySparkException.getErrorClass(): Mengembalikan kondisi kesalahan pengecualian sebagai string.
  • PySparkException.getMessageParameters(): Mengembalikan parameter pesan pengecualian sebagai kamus.
  • PySparkException.getSqlState(): Mengembalikan SQLSTATE ekspresi sebagai string.

Scala

Untuk Scala, gunakan SparkThrowable

  • getErrorClass(): Mengembalikan kondisi kesalahan sebagai string.
  • getMessageParameters(): Mengembalikan parameter pesan sebagai peta.
  • getSqlState(): Mengembalikan SQLSTATE sebagai string.

Contoh

  • Tangkap pengecualian dan tampilkan kondisi kesalahan, parameter pesan, dan SQLSTATE. Tampilkan juga pesan kesalahan default

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

    Phyton

    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)
    

    Hasil

      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
    
  • Tangkap SQLSTATE 42P01 saja dan tampilkan pesan kustom:

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

    Phyton

    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
    

    Hasil

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • Tangkap kondisi error TABLE_OR_VIEW_NOT_FOUND saja dan tampilkan pesan khusus.

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

    Phyton

    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
    

    Hasil

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

Pengecualian yang dilaporkan pengguna

Azure Databricks menyediakan fungsi berikut untuk meningkatkan kesalahan yang ditentukan pengguna:

  • raise_error

    Memunculkan pengecualian dengan pesan kesalahan kustom.

  • assert_true

    Menimbulkan kesalahan dengan pesan kesalahan opsional, jika kondisi tidak terpenuhi.

Kedua fungsi mengembalikan kondisi kesalahan 'USER_RAISED_EXCEPTION' dan SQLSTATE'P0001' bersama dengan pesan yang ditentukan pengguna.

Contoh

> 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