مشاركة عبر


معالجة الأخطاء في Azure Databricks

ينطبق على: وضع علامة Databricks SQL وضع علامة Databricks Runtime 12.2 وما فوق

مكونات الخطأ

عندما يثير Azure Databricks خطأ فإنه يتضمن المكونات التالية:

  • فئة الخطأ

    سلسلة وصفية قابلة للقراءة من قبل الإنسان فريدة من نوعها لحالة الخطأ.

    تتضمن بعض فئات الخطأ تسميات فرعية.

    على سبيل المثال: TABLE_OR_VIEW_NOT_FOUND، INCOMPLETE_TYPE_DEFINITION . صفيف.

    للحصول على قائمة بجميع فئات الخطأ، راجع فئات الخطأ.

  • SQLSTATE

    سلسلة طويلة مكونة من خمسة أحرف، تجمع فئات الخطأ في تنسيق قياسي معتمد من قبل العديد من المنتجات وواجهات برمجة التطبيقات.

    على سبيل المثال: '42P01'

    للحصول على قائمة كاملة بجميع SQLSTATEs المستخدمة من قبل Azure Databricks، راجع SQLSTATEs.

  • رسالة ذات معلمات

    رسالة الخطأ مع العناصر النائبة للمعلمات.

    على سبيل المثال: يتضمن TABLE_OR_VIEW_NOT_FOUND الرسالة التالية:

    The table or view <relationName> cannot be found.
    

    يمكنك استخدام الرسالة ذات المعلمات لعرض رسالة خطأ عن طريق تعيين قيم معلمات الرسالة إلى علامات المعلمة <parameter>.

  • معلمات الرسالة

    خريطة للمعلمات والقيم التي توفر معلومات إضافية حول الخطأ. على سبيل المثال: 'relationName' -> 'main.default.tab1'.

  • رسالة

    رسالة الخطأ المعروضة بالكامل، بما في ذلك فئة الخطأ و SQLSTATE، مع ملء المعلمات. على سبيل المثال:

    [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
    

تحذير

الرسالة والرسالة ذات المعلمات غير مستقرتين عبر الإصدارات. قد يتم تغيير نص الرسالة أو ترجمته دون إشعار. لمعالجة شرط خطأ برمجيا، استخدم "فئة الخطأ" و"SQLSTATEمعلمات الرسالة" بدلا من ذلك.

معالجة حالات الخطأ

ينطبق على: وضع علامة Databricks SQL وضع علامة Databricks Runtime 14.2 وما فوق

هام

هذه الميزة في المعاينة العامة.

يوفر Azure Databricks واجهات برمجة تطبيقات محددة للغة لمعالجة حالات الخطأ.

Python

بالنسبة إلى Python، استخدم pySparkException

  • PySparkException.getErrorClass(): إرجاع فئة الخطأ للاستثناء كسلسلة.
  • PySparkException.getMessageParameters(): إرجاع معلمات الرسالة للاستثناء كقاموس.
  • PySparkException.getSqlState(): إرجاع SQLSTATE التعبير كسلسلة.

Scala

بالنسبة إلى Scala، استخدم SparkThrowable

  • getErrorClass(): إرجاع فئة خطأ كسلسلة.
  • getMessageParameters(): إرجاع معلمات رسالة كخريطة.
  • getSqlState(): إرجاع SQLSTATE كسلسلة.

الأمثلة

  • التقاط أي استثناء وعرض فئة الخطأ ومعلمات الرسالة و SQLSTATE. عرض رسالة الخطأ الافتراضية أيضا

    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)
    

    نتيجة

      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
    
  • التقاط SQLSTATE 42P01 فقط وعرض رسالة مخصصة:

    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
    

    نتيجة

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • التقاط فئة TABLE_OR_VIEW_NOT_FOUND الخطأ فقط وعرض رسالة مخصصة:

    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
    

    نتيجة

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

استثناءات رفعها المستخدم

يوفر Azure Databricks الوظائف التالية لرفع الأخطاء المعرفة من قبل المستخدم:

  • raise_error

    رفع استثناء مع رسالة خطأ مخصصة.

  • assert_true

    رفع خطأ مع رسالة خطأ اختيارية، إذا لم يتم استيفاء شرط.

ترجع كلتا الدالتين فئة الخطأ "USER_RAISED_EXCEPTION" والجانب SQLSTATE 'P0001' مع رسالة معرفة من قبل المستخدم.

الأمثلة

> 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