التي استثناء يجب أن يرفع على مجموعات غير قانونية / سيئة حجة في بيثون؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وكنت أتساءل حول أفضل الممارسات للإشارة إلى مجموعات وسيطة غير صالحة في بيثون. جئت عبر عدد قليل من الحالات التي لديك وظيفة مثل ذلك:

def import_to_orm(name, save=False, recurse=False):
    """
    :param name: Name of some external entity to import.
    :param save: Save the ORM object before returning.
    :param recurse: Attempt to import associated objects as well. Because you
        need the original object to have a key to relate to, save must be
        `True` for recurse to be `True`.
    :raise BadValueError: If `recurse and not save`.
    :return: The ORM object.
    """
    pass

والانزعاج الوحيد مع ذلك هو أن كل مجموعة لديها قناعاتها، BadValueError عادة تختلف قليلا بها. وأنا أعلم أن في جاوة يوجد java.lang.IllegalArgumentException - وأنه يفهم جيدا أن الجميع سوف تخلق BadValueErrors الخاصة بهم في بيثون أم أن هناك آخر، الطريقة المفضلة

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

المحلول

وأود فقط رفع ValueError ، إلا إذا كنت في حاجة الى استثناء أكثر تحديدا ..

def import_to_orm(name, save=False, recurse=False):
    if recurse and not save:
        raise ValueError("save must be True if recurse is True")

وهناك حقا لا جدوى من القيام class BadValueError(ValueError):pass - فئة مخصصة مطابق في استخدامها ل<لأ href = "https://docs.python.org/2/library/exceptions.html#exceptions.ValueError" يختلط = "noreferrer "> ValueError ، لذلك لماذا لا تستخدم ذلك؟

نصائح أخرى

وأود أن ترث من ValueError

class IllegalArgumentError(ValueError):
    pass

ومن الأفضل في بعض الأحيان إلى إنشاء استثناءات الخاصة بك، ولكن ترث من المدمج في واحد، وهو أقرب إلى ما تريد ممكن.

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

وأعتقد أن أفضل طريقة للتعامل مع هذه هي الطريقة الثعبان نفسه يتعامل مع ذلك. بيثون يثير TypeError. على سبيل المثال:

$ python -c 'print(sum())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0

ولدينا ديف صغار فقط وجدوا هذه الصفحة في جوجل للبحث عن "استثناء الثعبان الحجج خاطئة" وأنا مندهش أن واضحة (بالنسبة لي) كان الجواب لا اقترح من أي وقت مضى في العقد منذ سئل هذا السؤال.

ولقد الغالب مجرد رأى ValueError المضمن المستخدمة في هذه الحالة.

وأنا لست متأكدا من أنني أتفق مع الإرث من ValueError - تفسيري من الوثائق هو أن ValueError هو فقط من المفترض أن تكون أثارها builtins ... وراثة منه أو رفع ذلك بنفسك يبدو غير صحيحة.

<اقتباس فقرة>   

وأثارت عند عملية المضمنة أو   يتلقى الدالة على القول بأن لديها   النوع الصحيح لكن غير مناسب   القيمة، وهذه الحالة ليست   التي وصفها استثناء أكثر دقة   مثل IndexError.

- الوثائق ValueError

وذلك يعتمد على ما هي المشكلة مع الحجج.

إذا الحجة لديه نوع خاطئ، رفع TypeError. على سبيل المثال، عندما تحصل على سلسلة بدلا من واحدة من تلك القيم المنطقية.

if not isinstance(save, bool):
    raise TypeError(f"Argument save must be of type bool, not {type(save)}")

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

إذا الحجج والقيم غير صالحة، ورفع ValueError. هذا يبدو أكثر ملاءمة في قضيتك:

if recurse and not save:
    raise ValueError("If recurse is True, save should be True too")

وأو في هذه الحالة المحددة، ولها قيمة الحقيقية للRECURSE تعني قيمة الحقيقية للحفظ. منذ أود أن تنظر هذا الانتعاش من خطأ، قد ترغب أيضا في أن يرفع شكوى في السجل.

if recurse and not save:
    logging.warning("Bad arguments in import_to_orm() - if recurse is True, so should save be")
    save = True

ونتفق مع اقتراح ماركوس "للفة استثناء الخاص بك، ولكن النص الاستثناء يجب أن يوضح أن المشكلة هي في قائمة وسيطة، وليس القيم حجة الفردية. فما استقاموا لكم فاستقيموا اقتراح:

class BadCallError(ValueError):
    pass

ويستخدم عند والحجج الكلمة المفقودة التي كانت مطلوبة لدعوة محددة، أو القيم حجة صحيحة بشكل فردي ولكن متناسقة مع بعضها البعض. سوف ValueError لا يزال على حق عندما حجة محددة هي النوع الصحيح ولكن خارج النطاق.

ويجب أن لا يكون هذا استثناء قياسية في بيثون؟

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

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