هل من المقبول رفع استثناء مدمج ، ولكن برسالة مختلفة ، في بيثون؟

StackOverflow https://stackoverflow.com/questions/2180577

سؤال

هل من المقبول رفع ملف استثناء مدمج مع نص مخصص؟ أو لرفع أ تحذير مدمج أيضا مع نص مخصص؟

يقرأ الوثائق:

قيمة الاستثناء: يتم رفعها عندما تتلقى عملية أو دالة مدمجة وسيطة (...)

هل هو ضمني ذلك فقط يجب أن ترفع العمليات المدمجة استثناءً من القيمة؟

في الممارسة العملية ، أفهم أنه من الآمن إنشاء فئة استثناء يرث من ValueRror أو استثناء. ولكن هل من المقبول ألا تفعل ذلك ، ورفع القيمة مباشرة ("نص مخصص")؟

نظرًا لأن ValueRror مدمج ، فإن رفع القيمة (بنص مخصص) يتيح للمستخدمين معرفة نوع المشكلة بسرعة ، مقارنة بنوع الاستثناء المخصص (شيء مثل "ValueRrorSpecificModule" ، وهو ليس قياسيًا).

هل كانت مفيدة؟

المحلول

لا يوجد شيء خاطئ من الناحية التشغيلية في فعل شيء مثل:

raise ValueError("invalid input encoding")

في الواقع ، أفعل ذلك كثيرًا عندما أكتب التمريرة الأولى لبعض الكود. المشكلة الرئيسية في القيام بذلك بهذه الطريقة هي أن عملاء الكود الخاص بك يواجهون صعوبة في الدقة في معالجة الاستثناء الخاصة بهم ؛ من أجل التقاط هذا الاستثناء المحدد ، سيتعين عليهم القيام بمطابقة السلسلة على كائن الاستثناء الذي اشتعلوه ، وهو أمر هش وممل بشكل واضح. وبالتالي ، سيكون من الأفضل تقديم فئة فرعية من ValueRror الخاصة بك ؛ لا يزال من الممكن اكتشاف ذلك على أنه ValueRror ، ولكن أيضًا كطبقة استثناء أكثر تحديدًا.

القاعدة العامة هي أنه كلما كان لديك رمز مثل:

raise ValueError('some problem: %s' % value)

ربما يجب أن تحل محله بشيء مثل:

class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

قد تقول أن نوع الاستثناء يحدد ماذا او ما حدث خطأ ، في حين تحدد الرسالة / السمات كيف لقد حدث خطأ.

نصائح أخرى

لا بأس وأنا أفعل ذلك طوال الوقت. أجد أنه من غير المثير للدهشة رؤية Typeerror من MySpecialTypeerror في العديد من المواقف.

على ال الصفحة التي ربطتها, ، لا أرى عبارة "مدمجة":

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

ربما رأى شخص ما سؤالك وأصلح الوثائق بالفعل.
تعديل: يبدو أنك قد أدخلت الوثائق ValueError بدلاً من TypeError

لا بأس تماما.

ومع ذلك ، قد ترغب في إنشاء فئة فرعية خاصة بك للمساعدة في التمييز بين الاستثناءات المدمجة

على سبيل المثال إذا كان لديك شيء يعمل مثل أ dict, ، يمكنك رفع keyerror للأسباب المعتادة ، ولكن ماذا لو كان keyerror يأتي حقًا من قولان أساسي تستخدمه في التنفيذ.

إن رفع فئة فرعية من keyerror يجعل من السهل رؤية وجود خطأ في التنفيذ ، وليس أن المفتاح ليس في كائنك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top