تقنية

contextmanager في بايثون: هل تسجيل الخطأ يبقيه ظاهرًا؟

contextmanager; own_manager; ValueError; caught; escaped:False; after:True
التقاط.

التقاط الخطأ وتسجيله دون raise داخل مولدنا يكبحه هنا. [1] [2]

الخلاصة السريعة

لا دون إعادة رفعه هنا. [1] [2]

  • التقاط الخطأ وتسجيله دون raise داخل مولدنا يكبحه هنا. [1] [2]
  • في CPython 3.12.14، own_manager تقدم "bud" وتلتقط ValueError وتضيف "caught" للسجل دون raise. [1] [2]
  • رفعنا ValueError داخل with؛ لم تصل except الخارجية: escaped=False، ووصلت التعليمة بعد with: after=True؛ السجل ["caught"]. [1] [2]
  • انتهاء المولد بعد الالتقاط يدل هنا على معالجة الخطأ. [1] [2]
  • تحكم جديد: control_manager تلتقط وتعيد رفع error=ValueError("control")؛ control_escaped=True وcontrol_after=False وsame_error=True لهوية الخطأ نفسه. مولدان متزامنان بقيمة yield واحدة وسجلين مستقلين؛ لا موارد فعلية. [1] [2]

التسجيل

التقاط الخطأ وتسجيله دون raise داخل مولدنا يكبحه هنا. [1] [2]

المولد

في CPython 3.12.14، own_manager تقدم "bud" وتلتقط ValueError وتضيف "caught" للسجل دون raise. [1] [2]

الخروج

رفعنا ValueError داخل with؛ لم تصل except الخارجية: escaped=False، ووصلت التعليمة بعد with: after=True؛ السجل ["caught"]. [1] [2]

from contextlib import contextmanager @contextmanager def own_manager(events): try:yield "bud" except ValueError:events.append("caught") own_events=[];escaped=after=False try: with own_manager(own_events):raise ValueError("owned") after=True except ValueError:escaped=True print(own_events,escaped,after) [1] [2]

control_manager; ValueError; caught; raise; control_escaped:True; control_after:False; same_error:True
رفع.

إعادة الرفع

انتهاء المولد بعد الالتقاط يدل هنا على معالجة الخطأ. [1] [2]

@contextmanager def control_manager(events): try:yield "bud" except ValueError: events.append("caught") raise control_events=[];error=ValueError("control") control_escaped=control_after=same_error=False try: with control_manager(control_events):raise error control_after=True except ValueError as exc:control_escaped=True;same_error=exc is error print(control_events,control_escaped,control_after,same_error) [1] [2]

تحكم جديد: control_manager تلتقط وتعيد رفع error=ValueError("control")؛ control_escaped=True وcontrol_after=False وsame_error=True لهوية الخطأ نفسه. مولدان متزامنان بقيمة yield واحدة وسجلين مستقلين؛ لا موارد فعلية. [1] [2]

المراجع

  1. Python contextmanager
  2. CPython contextmanager

للتوسع: لغات البرمجة.

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