الفرق بين المراجعتين لصفحة: «Python/built-in exceptions»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 167: | سطر 167: | ||
===<code>UnboundLocalError</code>=== | ===<code>UnboundLocalError</code>=== | ||
يُطلق عندما يُشار إلى متغير محلي في دالة أو تابع ولكن لم تعطَ قيمةٌ لهذا المتغير بعد. هذا الاستثناء هو صنف فرعي من <code>[[#NameError|NameError]]</code>. | يُطلق عندما يُشار إلى متغير محلي في دالة أو تابع ولكن لم تعطَ قيمةٌ لهذا المتغير بعد. هذا الاستثناء هو صنف فرعي من <code>[[#NameError|NameError]]</code>. | ||
===UnicodeError=== | ===<code>UnicodeError</code>=== | ||
يُطلق هذا الاستثناء عند حدوث خطأ ترميز أو فك ترميز يتعلق بيونيكود؛ وهو صنف فرعي من الصنف ValueError. يمتلك هذا الاستثناء خاصيات تشرح خطأ الترميز أو فك الترميز. فمثلًا، err.object[err.start:err.end] يعطي المُدخل غير الصالح الذي فشل عنده الترميز. | يُطلق هذا الاستثناء عند حدوث خطأ ترميز أو فك ترميز يتعلق بيونيكود؛ وهو صنف فرعي من الصنف <code>[[#ValueError|ValueError]]</code>. | ||
===encoding=== | |||
يمتلك هذا الاستثناء خاصيات تشرح خطأ الترميز أو فك الترميز. فمثلًا، <code>err.object[err.start:err.end]</code> يعطي المُدخل غير الصالح الذي فشل عنده الترميز. | |||
====<code>encoding</code>==== | |||
اسم الترميز الذي أطلق الخطأ. | اسم الترميز الذي أطلق الخطأ. | ||
===reason=== | ====<code>reason</code>==== | ||
نص يصف خطأ الترميز بالتفصيل. | نص يصف خطأ الترميز بالتفصيل. | ||
===object=== | ====<code>object</code>==== | ||
الكائن الذي تم محاولة ترميزه أو فك ترميزه. | الكائن الذي تم محاولة ترميزه أو فك ترميزه. | ||
===start=== | ====<code>start</code>==== | ||
الفهرس الأول للبيانات غير الصالحة في الكائن. | الفهرس الأول للبيانات غير الصالحة في الكائن. | ||
===end=== | ====<code>end</code>==== | ||
الفهرس بعد آخر بيانات غير الصالحة. | الفهرس بعد آخر بيانات غير الصالحة. | ||
===UnicodeEncodeError=== | ===<code>UnicodeEncodeError</code>=== | ||
يُطلق عند حدوث خطأ ترميز. وهو صنف فرعي من UnicodeError. | يُطلق عند حدوث خطأ ترميز. وهو صنف فرعي من <code>[[#UnicodeError|UnicodeError]]</code>. | ||
===UnicodeDecodeError=== | ===<code>UnicodeDecodeError</code>=== | ||
يُطلق عند حدوث خطأ فك ترميز. وهو صنف فرعي من UnicodeError. | يُطلق عند حدوث خطأ فك ترميز. وهو صنف فرعي من <code>[[#UnicodeError|UnicodeError]]</code>. | ||
===UnicodeTranslateError=== | ===<code>UnicodeTranslateError</code>=== | ||
يُطلق عند حدوث خطأ ترميز خلال عملية التحويل. وهو صنف فرعي من UnicodeError. | يُطلق عند حدوث خطأ ترميز خلال عملية التحويل. وهو صنف فرعي من <code>[[#UnicodeError|UnicodeError]]</code>. | ||
===ValueError=== | ===<code>ValueError</code>=== | ||
يُطلق عندما تتسلم عملية داخلية أو دالة وسيط بنوع صحيح ولكن بقيمة غير مناسبة، ولا يوجد معلومات أكثر عن الخطأ من قبيل ظهور الاستثناء IndexError مثلًا. | يُطلق عندما تتسلم عملية داخلية أو دالة وسيط بنوع صحيح ولكن بقيمة غير مناسبة، ولا يوجد معلومات أكثر عن الخطأ من قبيل ظهور الاستثناء <code>[[#IndexError|IndexError]]</code> مثلًا. | ||
===ZeroDivisionError=== | ===<code>ZeroDivisionError</code>=== | ||
يُطلق عندما يكون الوسيط الثاني من عملية القسمة أو باقي القسمة هو صفر. القيمة المرتبطة هي نص يشير إلى نوع القيم التي تجرى عليها العملية والعملية. | يُطلق عندما يكون الوسيط الثاني من عملية القسمة أو باقي القسمة هو صفر. القيمة المرتبطة هي نص يشير إلى نوع القيم التي تجرى عليها العملية والعملية. | ||
الاستثناءات التالية بقيت من أجل التوافقية مع نُسخ بايثون السابقة، ابتداءً من بايثون 3.3، تُعتبر أسماءً بديلةً (aliases) للاستثناء OSError. | الاستثناءات التالية بقيت من أجل التوافقية مع نُسخ بايثون السابقة، ابتداءً من بايثون 3.3، تُعتبر أسماءً بديلةً (aliases) للاستثناء <code>[[#OSError|OSError]]</code>. | ||
===EnvironmentError=== | ===<code>EnvironmentError</code>=== | ||
===IOError=== | ===<code>IOError</code>=== | ||
===WindowsError=== | ===<code>WindowsError</code>=== | ||
متاحةٌ في نظام الويندوز فقط. | |||
==استثناءات نظام التشغيل== | ==استثناءات نظام التشغيل== | ||
الاستثناءات التالية هي أصناف فرعية من الاستثناء OSError وتُطلق بناءً على رقم الخطأ الصادر من النظام. | الاستثناءات التالية هي أصناف فرعية من الاستثناء <code>OSError</code> وتُطلق بناءً على رقم الخطأ الصادر من النظام. | ||
===BlockingIOError=== | ===<code>BlockingIOError</code>=== | ||
يُطلق عندما يُحجز كائنٌ (مثل socket) من قبل عملية ما ويكون هذا الكائن مضبوطًا لعملية غير حاجزة non-blocking. يرتبط هذا الاستثناء بأرقام الأخطاء التالية: EAGAIN و EALREADY و EWOULDBLOCK و EINPROGRESS. | يُطلق عندما يُحجز كائنٌ (مثل <code>socket</code>) من قبل عملية ما ويكون هذا الكائن مضبوطًا لعملية غير حاجزة (non-blocking). يرتبط هذا الاستثناء بأرقام الأخطاء التالية: <code>EAGAIN</code> و <code>EALREADY</code> و <code>EWOULDBLOCK</code> و <code>EINPROGRESS</code>. | ||
بالاضافة لما تملكه الاستثناءات OSError و BlockingIOError من خاصيات، توجد خاصية واحدة إضافية وهي: | بالاضافة لما تملكه الاستثناءات <code>[[#OSError|OSError]]</code> و <code>[[#BlockingIOError|BlockingIOError]]</code> من خاصيات، توجد خاصية واحدة إضافية وهي: | ||
===characters_written=== | ===<code>characters_written</code>=== | ||
هو رقم صحيح يحتوي على عدد المحارف التي كتُبت في stream من قَبل حجزها. هذه الخاصية متاحة عند استخدام أصناف عمليات الإدخال والإخراج المحفوظة في الذاكرة المؤقتة والموجودة في وحدة io. | هو رقم صحيح يحتوي على عدد المحارف التي كتُبت في <code>stream</code> من قَبل حجزها. هذه الخاصية متاحة عند استخدام أصناف عمليات الإدخال والإخراج المحفوظة في الذاكرة المؤقتة والموجودة في وحدة <code>io</code>. | ||
===ChildProcessError=== | ===<code>ChildProcessError</code>=== | ||
يُطلق هذا الاستثناء عندما يفشل إجراء ما في عملية ابن (child process). يرتبط هذا الاستثناء برقم الخطأ ECHILD. | يُطلق هذا الاستثناء عندما يفشل إجراء ما في عملية ابن (child process). يرتبط هذا الاستثناء برقم الخطأ <code>ECHILD</code>. | ||
=== <code>ConnectionError</code> === | |||
الصنف الأساسي للقضايا المتعلقة بالاتصال. الأصناف الفرعية من هذا الاستثناء هي <code>[[#BrokenPipeError|BrokenPipeError]]</code> و <code>[[#ConnectionAbortedError|ConnectionAbortedError]]</code> و <code>[[#ConnectionRefusedError|ConnectionRefusedError]]</code> و <code>[[#ConnectionResetError|ConnectionResetError]]</code>. | |||
الصنف الأساسي للقضايا المتعلقة بالاتصال. الأصناف الفرعية من هذا الاستثناء هي BrokenPipeError و ConnectionAbortedError و ConnectionRefusedError و ConnectionResetError. | |||
===BrokenPipeError=== | ===BrokenPipeError=== | ||
هذا الاستثناء هو صنف فرعي من | هذا الاستثناء هو صنف فرعي من <code>[[#ConnectionError|ConnectionError]]</code>، ويُطلق عند محاولة الكتابة في أنبوب (pipe) بينما تكون نهايته قد أُغلقت، أو عند محاولة الكتابة في <code>socket</code> قد تم وقف الكتابة فيها. يرتبط هذا الاستثناء بأرقام الخطأ <code>EPIPE</code> و <code>ESHUTDOWN</code>. | ||
===ConnectionAbortedError=== | ===<code>ConnectionAbortedError</code>=== | ||
هذا الاستثناء هو صنف فرعي من | هذا الاستثناء هو صنف فرعي من <code>[[#ConnectionError|ConnectionError]]</code>، ويُطلق عندما تُحبَط محاولة الاتصال من قبل الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ <code>ECONNABORTED</code>. | ||
===ConnectionRefusedError=== | ===<code>ConnectionRefusedError</code>=== | ||
هذا الاستثناء هو صنف فرعي من | هذا الاستثناء هو صنف فرعي من <code>[[#ConnectionError|ConnectionError]]</code>، ويُطلق عندما تُرفض محاولة الاتصال من الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ <code>ECONNREFUSED</code>. | ||
===ConnectionResetError=== | ===<code>ConnectionResetError</code>=== | ||
هذا الاستثناء هو صنف فرعي من | هذا الاستثناء هو صنف فرعي من <code>[[#ConnectionError|ConnectionError]]</code>، ويُطلق عندما يُعاد ضبط الاتصال من الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ <code>ECONNRESET</code>. | ||
===FileExistsError=== | ===<code>FileExistsError</code>=== | ||
يُطلق عند محاولة إنشاء ملف أو مجلد موجود مُسبقًا. يرتبط هذا الاستثناء برقم الخطأ EEXIST. | يُطلق عند محاولة إنشاء ملف أو مجلد موجود مُسبقًا. يرتبط هذا الاستثناء برقم الخطأ <code>EEXIST</code>. | ||
===FileNotFoundError=== | ===<code>FileNotFoundError</code>=== | ||
يطلق هذا الاستثناء عندما يُطلب ملف أو مجلد ولكنه غير موجود. يرتبط هذا الاستثناء برقم الخطأ ENOENT. | يطلق هذا الاستثناء عندما يُطلب ملف أو مجلد ولكنه غير موجود. يرتبط هذا الاستثناء برقم الخطأ <code>ENOENT</code>. | ||
===InterruptedError=== | ===<code>InterruptedError</code>=== | ||
يطلق هذا الاستثناء عند مقاطعة إستدعاء ما من قبل النظام بواسطة إشارة قادمة (incoming signal). يرتبط هذا الاستثناء برقم الخطأ EINTR. | يطلق هذا الاستثناء عند مقاطعة إستدعاء ما من قبل النظام بواسطة إشارة قادمة (incoming signal). يرتبط هذا الاستثناء برقم الخطأ EINTR. | ||
التغييرات في إصدار بايثون 3.5: تُعيد بايثون استدعاءات النظام عندما تُقاطَع باستخدام إشارة قادمة، إلا إذا أَطلق مُعالج الإشارة استثناءً. | التغييرات في إصدار بايثون 3.5: تُعيد بايثون استدعاءات النظام عندما تُقاطَع باستخدام إشارة قادمة، إلا إذا أَطلق مُعالج الإشارة استثناءً. | ||
===IsADirectoryError=== | ===<code>IsADirectoryError</code>=== | ||
يُطلق عندما تطلب دالةٌ تجري عمليةً على ملفٍ ما (مثل os.remove()) مجلدًا ما. يرتبط هذا الاستثناء برقم الخطأ EISDIR. | يُطلق عندما تطلب دالةٌ تجري عمليةً على ملفٍ ما (مثل <code>os.remove()</code>) مجلدًا ما. يرتبط هذا الاستثناء برقم الخطأ <code>EISDIR</code>. | ||
===NotADirectoryError=== | ===<code>NotADirectoryError</code>=== | ||
يُطلق عندما تُستدعى دالةٌ تجري عمليةً على مجلدٍ ما (مثل (os.listdir() على متغير أو مُعَرف ليس بمجلد. يرتبط هذا الاستثناء برقم الخطأ | يُطلق عندما تُستدعى دالةٌ تجري عمليةً على مجلدٍ ما (مثل <code>(os.listdir(</code>) على متغير أو مُعَرف ليس بمجلد. يرتبط هذا الاستثناء برقم الخطأ <code>ENOTDIR</code>. | ||
===PermissionError=== | ===<code>PermissionError</code>=== | ||
يطلق عند محاولة تشغيل عملية دون وجود صلاحيات الوصول المناسبة لذلك، مثل أذونات ملفات النظام. يرتبط هذا الاستثناء برقم الخطأ EACCES و EPERM. | يطلق عند محاولة تشغيل عملية دون وجود صلاحيات الوصول المناسبة لذلك، مثل أذونات ملفات النظام. يرتبط هذا الاستثناء برقم الخطأ <code>EACCES</code> و <code>EPERM</code>. | ||
===ProcessLookupError=== | ===<code>ProcessLookupError</code>=== | ||
يطلق عندما تكون العملية المُمَرَّرة غير موجودة. يرتبط برقم الخطأ | يطلق عندما تكون العملية المُمَرَّرة غير موجودة. يرتبط برقم الخطأ <code>ESRCH</code>. | ||
===TimeoutError=== | ===<code>TimeoutError</code>=== | ||
يُطلق عندما تنتهي مدة صلاحية دالة نظام على مستوى النظام. يرتبط هذا الاستثناء برقم الخطأ | يُطلق عندما تنتهي مدة صلاحية دالة نظام على مستوى النظام. يرتبط هذا الاستثناء برقم الخطأ <code>ETIMEDOUT</code>. | ||
جميع الاستثناءات السابقة أُضيفت في بايثون 3.3 وهي أصناف فرعية من الصنف OSError. | جميع الاستثناءات السابقة أُضيفت في بايثون 3.3 وهي أصناف فرعية من الصنف <code>[[#OSError|OSError]]</code>. | ||
==التحذيرات== | ==التحذيرات== | ||
تُستخدم الاستثناءات التالية كتحذيرات، انظر للوحدة warnings لمزيد من المعلومات. | تُستخدم الاستثناءات التالية كتحذيرات، انظر للوحدة <code>warnings</code> لمزيد من المعلومات. | ||
===Warning=== | ===<code>Warning</code>=== | ||
الصنف الأساسي لاستثناءات التحذيرات. | الصنف الأساسي لاستثناءات التحذيرات. | ||
===UserWarning=== | ===<code>UserWarning</code>=== | ||
الصنف الأساسي للتحذيرات التي تُوَلدها شيفرة المستخدم. | الصنف الأساسي للتحذيرات التي تُوَلدها شيفرة المستخدم. | ||
===DeprecationWarning=== | ===<code>DeprecationWarning</code>=== | ||
الصنف الأساسي لتحذيرات الميزات المُهملة (deprecated features). | الصنف الأساسي لتحذيرات الميزات المُهملة (deprecated features). | ||
===PendingDeprecationWarning=== | ===<code>PendingDeprecationWarning</code>=== | ||
الصنف الأساسي لتحذيرات الميزات التي ستُهمل في المستقبل. | الصنف الأساسي لتحذيرات الميزات التي ستُهمل في المستقبل. | ||
===SyntaxWarning=== | ===<code>SyntaxWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بالصيغ المشكوك في صحتها. | الصنف الأساسي للتحذيرات الخاصة بالصيغ المشكوك في صحتها. | ||
===RuntimeWarning=== | ===<code>RuntimeWarning</code>=== | ||
الصنف الأساسي للتحذيرات التي تظهر أثناء تنفيذ الشيفرة البرمجية. | الصنف الأساسي للتحذيرات التي تظهر أثناء تنفيذ الشيفرة البرمجية. | ||
===FutureWarning=== | ===<code>FutureWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بالدوال البانية التي ستتغير لُغويًا في المستقبل. | الصنف الأساسي للتحذيرات الخاصة بالدوال البانية التي ستتغير لُغويًا في المستقبل. | ||
===ImportWarning=== | ===<code>ImportWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بالأخطاء المُحتملة أثناء استيراد الوحدات. | الصنف الأساسي للتحذيرات الخاصة بالأخطاء المُحتملة أثناء استيراد الوحدات. | ||
===UnicodeWarning=== | ===<code>UnicodeWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بالترميز. | الصنف الأساسي للتحذيرات الخاصة بالترميز. | ||
===BytesWarning=== | ===<code>BytesWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بالنوعين bytes و bytearray. | الصنف الأساسي للتحذيرات الخاصة بالنوعين <code>[[Python/bytes|bytes]]</code> و <code>[[Python/bytearray|bytearray]]</code>. | ||
===ResourceWarning=== | ===<code>ResourceWarning</code>=== | ||
الصنف الأساسي للتحذيرات الخاصة بحجم استخدام مصدر ما. | الصنف الأساسي للتحذيرات الخاصة بحجم استخدام مصدر ما. | ||
هذا الاستثناء جديدٌ في بايثون 3.2. | |||
هذا الاستثناء جديدٌ في بايثون 3.2 | |||
== مصادر == | |||
* [https://docs.python.org/3/library/exceptions.html صفحة Built-in Exceptions في توثيق بايثون الرسمي]. | |||
__لافهرس__ | __لافهرس__ |
مراجعة 10:21، 7 مايو 2018
الاستثناءات الداخلية
يجب أن تكون جميع الاستثناءات في لغة بايثون مُنشأة من صنف مُشتق من الصنف BaseException
. عند ذكر صنف مُحدد في جملة except
خلال تعبير try
، فإن جملة except
تُعالج أي استثناء مُشتق من ذلك الصنف المُحدَّد (وليس الاستثناءات المُشتقة من الصنف الذي اُشتقت منه). إذا كان لدينا صنفا استثناءات غير مرتبطين بعلاقة وراثة فهما غير متماثلان حتى لو كانا بنفس الاسم.
من الممكن توليد الاستثناءات الداخلية المذكورة بالأسفل بواسطة مُفسر بايثون أو الدوال الداخلية. تملك الاستثناءات "قيمة مرتبطة" تُشير بالتفصيل للسبب الرئيسي للخطأ إلا إذ ذُكِرَ خلاف ذلك. من الممكن أن تكون هذه القيمة عبارة عن نص أو صف (tuple) معلومات يتألف من عدة عناصر (مثال، رمز الخطأ ونص يصف الرمز). عادةً ما تُمرر القيمة المرتبطة كوسائط للدالة البانية لصنف الاستثناء.
من الممكن إطلاق الاستثناءات الداخلية خلال الشيفرة البرمجية بشكل مباشر. يُمكن استخدام ذلك لاختبار مُعالج استثناء أو لإبراز خطأ في شرط ما تمامًا كما في حالة قيام المُفسر بإطلاق نفس الخطأ، ولكن يجب الانتباه الى أنه لا يوجد ما يمنع الشيفرة من إطلاق خطأ غير مناسب.
قد تُستخدم الاستثناءات الداخلية في تعريف استثناءات جديدة بواسطة وراثة الأصناف. يُنصح المبرمجون بأن يشتقوا استثناءاتٍ جديدةً من الصنف Exception
أو أحد الأصناف الفرعية منه وليس من الصنف BaseException
. مزيدٌ من المعلومات حول تعريف الاستثناءات متاحٌ في صفحة الاستثناءات المعرفة من طرف المستخدم.
عند إطلاق (أو إعادة إطلاق) استثناء ما في جملة except
او finally
فإن الخاصية __context__
ستُضبَط تلقائيًا إلى قيمة آخر استثناء مُلتقط، وإذا لم يُعالج ظهور استثناء جديد فإن نص سلسلة تتبع الاستثناءات (traceback) سيتضمن الاستثناءات المُسَببة بالإضافة للاستثناء الأخير.
عند إطلاق استثناء جديد (بدلًا من استخدام raise
لإعادة إطلاق الاستثناء المُعالج حاليًا)، فإنه من الممكن إضافة السبب الصريح لسياق الاستثناء المُضمن من خلال استخدام جملة raise
مع from
بالشكل التالي:
raise new_exc from original_exc
في المثال التالي يتم إطلاق الاستثناء ArithmeticError
في البداية، ولمّا كان الاستثناء ليس له استثناء مُسبب فسيكون السياق الخاص به المتمثل بالخاصية __context__
ذات قيمة None
، بينما الاستثناء AsserionError
تم إطلاقه باستخدام الجملة raise...from
وتم تحديد الاستثناء الأول كمسبب له، لذلك فإن الخاصية __context__
للاستثناء AsserionError
سيكون هو ArithmeticError
، وعند طباعته ستظهر جملة الاستثناء y should not be equal to 2
.
y = 2
try:
if y==2:
raise ArithmeticError("y should not be equal to 2")
except Exception as e1:
print(e1.__context__)
try:
raise AssertionError("Assertion message") from e1
except AssertionError as e2:
print(e2.__context__)
التعبير الذي يلي كلمة from
يجب أن يكون استثناءً أو القيمة None
، إذ سيُضبَط قيمةً للخاصية __cause__
في الاستثناء الذي سيُطلَق. ستُضبَط قيمة الخاصية __suppress_context__
ضمنيًا لتأخذ القيمة True
عند ضبط قيمة الخاصية __cause__
، وبذلك فإن استخدام raise new_exc from None
سيُبدِّل الاستثناء القديم إلى الجديد لأغراض العرض (مثال، تحويل الاستثناء KeyError
إلى AttributeError
بينما يُترك الاستثناء القديم متاحًا في الخاصية __context__
لأغراض الفحص في التنقيح).
تقوم سلسلة تتبع الاستثناءات (traceback) بعرض سلسلة الأخطاء التي تظهر بالإضافة للاستثناء نفسه. سَتُعرض سلسلة الاستثناء (traceback) الصريحة في الخاصية __cause__
دائمًا إذا كانت موجودة. لكن سَتُعرض سلسلة الاستثناء الضمنية في الخاصية __context__
إذا كانت قيمة الخاصية __cause__
هي None
وقيمة الخاصية __suppress_context__
هي false
.
بغض النظر عن أي حالة، سيُعرَض الاستثناء بعد أي سلسلة استثناءات بحيث يكون آخر سطر من سلسلة تتبع الاستثناء (traceback) هو سطر الاستثناء الذي تم إطلاقه.
الأصناف الأساسية
تُستخدم الاستثناءات التالية في الغالب كأصناف أساسية لاستثناءات أخرى في بايثون.
BaseException
الصنف الأساسي لكافة الاستثناءات الداخلية. ليس الهدف أن نرث منه مباشرةً بواسطة الأصناف المُعرفة من طرف المستخدم (عليك أن تستخدم لذلك الأمر الصنفَ Exception
). إذا اُستدعيت الدالة str()
من قبل نُسخة من هذا الصنف، فسيتم إعادة معطيات النُسخة أو نص فارغ في حالة عدم وجود وسائط.
args
صف (tuple) من الوسائط المُمرَّرة للدالة البانية للاستثناء. بعض الاستثناءات المُضمَّنة مسبقًا في اللغة (مثل OSError
) تتوقع عددًا مُحددًا من الوسائط، بينما الاستثناءات الأخرى تُستدعى في العادة باستخدام سلسلة نصية تُمثل رسالة الخطأ.
with_traceback(tb)
يعمل هذا التابع على جعل tb
كسلسلة تتبع الاستثناء الجديدة (traceback) للاستثناء وتُعيد الكائن الذي يُمثل الاستثناء. ويُستخدم هذا التابع غالبًا في معالجة الاستثناء بالشكل التالي:
try:
...
except SomeException:
tb = sys.exc_info()[2]
raise OtherException(...).with_traceback(tb)
Exception
جميع الاستثناءات الداخلية واستثناءات non-system-exiting مُشتقة من هذا الصنف. جميع الاستثناءات المبنية من طرف المستخدم يجب أن تُشتق من هذا الصنف.
ArithmeticError
هذا الصنف هو أساس الاستثناءات الداخلية التي تُطلق عند حدوث الأخطاء الحسابية: OverflowError
و ZeroDivisionError
و FloatingPointError
.
BufferError
يُطلق هذا الاستثناء اذا كانت هناك عملية لها علاقة بالذاكرة لا يُمكن تنفيذها.
LookupError
هذا الصنف هو الصنف الأساسي للاستثناءات التي تُطلق عندما يفشل استخدام مفتاح أو فهرس غير صالح في عملية ربط (mapping) أو في تسلسل (sequence): IndexError
و KeyError
. يمكن أن يُطلق هذا الاستثناء مباشرةً باستخدام codecs.lookup().
الاستثناءات العملية
تُطلق الاستثناءات التالية غالبًا في بايثون:
AssertionError
يُطلق هذا الاستثناء عندما يفشل تنفيذ جملة assert
.
AttributeError
يُطلق هذا الاستثناء عند فشل ربط خاصية أو فشل الإشارة إليها (انظر الاشارة إلى الخاصيات). سيُطلق الاستثناء TypeError
عندما لا يدعم كائن ما الاشارة لخاصية أو ربط قيمة لها.
EOFError
يُطلق هذا الاستثناء عندما يتحقق شرط نهاية الملف EOF في الدالة input()
. تُعيد التوابع io.IOBase.read()
و io.IOBase.readline()
نصًا فارغًا عند تحقق شرط نهاية الملف.
FloatingPointError
يُطلق عند فشل عملية حسابية لأرقام تحتوي على نقطة عائمة floating point. هذا الاستثناء مُعرف دائمًا، ولكنه يُطلق فقط عند ضبط بايثون مع الخيار --with-fpectl
، او عندما يُعرَّف الرمز WANT_SIGFPE_HANDLER
في الملف pyconfig.h
.
GeneratorExit
يطلق عند إغلاق مولد أو coroutine. انظر إلى generator.close()
و coroutine.close()
. يرث هذا الاستثناء من الصنف BaseException
بدلًا من Exception
لأنه تقنيًا ليس بخطأ.
ImportError
يُطلق هذا الاستثناء عندما تواجه جملة الاستيراد import
مشاكل في محاولة تحميل وحدة. بالإضافة لذلك، يُطلق الاستثناء عندما تحتوي جملة from ... import
على اسم لا يمكن إيجاده.
يُمكن ضبط الخاصيات name
و path
كوسائط على شكل كلمات مفتاحية فقط (keyword-only arguments) إلى الدالة البانية للاستثناء. عند ضبطهما، فإن الاسم name
يُمثل الوحدة التي فشل محاولة استيرادها، ويُمثل المسار path
مسار الملف الذي أطلق الاستثناء.
ModuleNotFoundError
هذا الاستثناء هو صنف فرعي من ImportError
ويُطلق بواسطة import
عندما لا يُمكن تحديد مكان وحدة ما. يُطلق هذا الاستثناء أيضًا عندما تُوجد القيمة None
في sys.modules
.
هذا الاستثناء جديدٌ في نسخة بايثون 3.6.
IndexError
يُطلق هذا الاستثناء عند استخدام فهارس خارج النطاق. (تُعدل فهارس الاقتطاع تلقائيًا لتقع ضمن النطاق المسموح به؛ إذا كان الفهرس ليس رقمًا، فسيُطلق الاستثناء TypeError
).
KeyError
يُطلق هذا الاستثناء عند استخدام مفتاح غير موجود ضمن مفاتيح قاموس ما.
KeyboardInterrupt
يُطلق هذا الاستثناء عند استعمال مُفتاح المقاطعة (interrupt key) (عادة Control-C
أو Delete
). تُنفذ فحوصات المقاطعة بشكل منتظم خلال عملية التنفيذ. يرث هذا الاستثناء من الصنف BaseException
حتى لا يُلتقط من الشيفرة التي تلتقط الاستثناء Exception
وبذلك يُمنع المفسر من الخروج.
MemoryError
يُطلق هذا الاستثناء عندما تَستهلك عمليةٌ ما الذاكرةَ مع إمكانية معالجة المشكلة بحذف بعض الكائنات. القيمة المرتبطة بهذا الاستثناء هي نص يشير الى نوعية العملية التي استهلكت الذاكرة. لاحظ أنه بسبب هيكلية إدارة الذاكرة الكامنة (الدالة malloc()
في لغة C)، فإن المُفسر قد لا يستطيع معالجة هذا الموقف بشكل كامل؛ ومع ذلك، سيُطلق المفسر استثناءً بحيث تُطبع سلسلة تتبع الاستثناءات (stack traceback) في حالة أن السبب هو برنامج طويل التنفيذ.
NameError
يُطلق هذا الاستثناء عندما لا يمكن إيجاد اسم عام أو محلي، وهذا ينطبق فقط على الأسماء غير المعرفة بشكل كامل (unqualified). القيمة المرتبطة بهذا الاستثناء هي رسالة خطأ تحتوي على الاسم الذي لا يمكن إيجاده.
NotImplementedError
يُشتق هذا الاستثناء من الصنف RuntimeError
. يجب على التوابع المجردة (abstract) في الأصناف المُعرفة من قبل المستخدم إطلاق هذا الاستثناء عندما تتطلب الأصناف المُشتقة إعادة تعريف التابع، أو عندما يكون الصنف طُوِّرَ للإشارة الى أن تُضاف شيفرة الإعتماد (implementation).
ملاحظة: لا ينبغي استخدام الاستثناء للاشارة إلى أن عاملًا أو تابعًا ما ليسا للاستخدام؛ في هذه الحالة اترك العامل أو التابع دون تعريف، أو اضبطه إلى القيمة None
(إذا كان صنفًا فرعيًا).
ملاحظة: لا يُستخدم الصنفان NotImplementedError
و NotImplemented
تبادليًا، حتى وإن كانا بأسماء وأغراض متشابهة، لمعرفة المزيد انظر الى توثيق الصنف NotImplemented
.
OSError([arg])
OSError(errno, strerror[, filename[, winerror[, filename2]]])
يُطلق هذا الاستثناء عندما تُعيد دالة نظام خطأ له علاقة بالنظام، ويشمل ذلك فشل عمليات الإدخال/الإخراج مثل "الملف غير موجود" او "القرص ممتلئ" (غير مناسب لأنواع الوسائط غير الصحيحة أو الأخطاء العرضية).
الشكل الثاني من الدالة البانية تَضبط الخواص المتعلقة المشروحة بالأسفل. تُضبط الخاصيات بقيمة None
عند عدم ذكرها.
للتوافقية الرجوعية (backwards compatibility)، إذا مُرِّرَت ثلاثة وسائط، فستحتوي الخاصية args
على صفين (tuple) من أول وسيطين من الدالة البانية.
تُعيد الدالة البانية في العادة صنفًا فرعيًا من OSError
، كما هو موضح في OSexception
بالأسفل. يعتمد الصنف الفرعي المحدد على القيمة النهائية للقيمة errno
. يحدث ذلك فقط عند بناء OSError
مباشرةً أو باستخدام اسم بديل (alias)، ولم يُرث خلال تصنيف فرعي.
errno
رمز خطأ رقمي من متغير C باسم errno
.
winerror
في نظام ويندوز، يعطيك هذا رقم الخطأ المحلي (native error code) على مستوى النظام. أما في معايير POSIX، الخاصية errno
هي ترجمة تقريبية للخطأ المحلي.
في نظام ويندوز، إذا كان الوسيط winerror
رقمًا، فإن الخاصية errno
تُحدد من رقم الخطأ الخاص بنظام ويندوز، ويُتجاهل الوسيط errno
. أما في البيئات الأخرى، فسيُتجاهل الوسيط winerror
، والخاصية winerror
لن تكون موجودةً.
Strerror
رسالة الخطأ التي زودها نظام التشغيل. تُنسق رسالة الخطأ بواسطة الدالة perror() في لغة السي في أنظمة POSIX، وبواسطة الدالة FormatMessage() في نظام الويندوز.
filename
filename2
في الاستثناءات التي تنطوي على مسار ملف في النظام، الخاصية filename
هي اسم الملف المُمَر لدوال مثل open()
و os.unlike()
.
للدوال التي تحتوي على مسارَي ملف مثل os.rename()
، ستُمثِّل الخاصية filename2
اسم الملف الثاني المُمَر للدالة.
التغييرات التي حدثت في إصدار بايثون 3.3: الاستثناءات EnvironmentError
و IOError
و WindowsError
و socket.error
و select.error
و mmap.error
دُمجت في OSError
، والدالة البانية قد تُعيد صنف فرعي.
التغييرات التي حدثت في إصدار بايثون 3.4: الخاصية filename
أصبحت الاسم الأصلي للملف المُمَرر للدالة، بدلًا من الاسم المُرَمز/مفكوك-ترميزه من ترميز ملف النظام. بالإضافة لذلك، أُضيف الوسيط والخاصية filename2
.
OverflowError
يُطلق هذا الاستثناء عندما تكون نتيجة عملية حسابية كبيرة جدًا بحيث لا يمكن تمثيلها. لا يمكن أن يحدث ذلك للأرقام الصحيحة integers
(يُطلق الاستثناء MemoryError
لذلك). على الرغم من ذلك ولأسباب تاريخية، يُطلق الخطأ OverflowError
في بعض الأحيان للأرقام الصحيحة التي هي خارج نطاق المطلوب. أغلب العمليات الحسابية التي تحتوي على النقطة العائمة لا تُفحص بسبب عدم وجود معيار حاكم لاستثناءات الأعداد ذات النقطة العائمة في معالجة الاستثناء في لغة C.
RecursionError
هذا الاستثناء مُشتق من الصنف RuntimeError
، ويطلق عندما يكتشف المفسر أن العمق الأعلى للاستدعاء التعاودي (recursion depth) تم تجاوزه (انظر الى sys.getrecursionlimit()
).
هذا الاستثناء جديدٌ في بايثون 3.5: في السابق كان يُطلَق الاستثناء RuntimeError
.
ReferenceError
يُطلق هذا الاستثناء عندما يُستخدم وكيل إشارة ضعيف (weak reference proxy) مُنشأ باستخدام الدالة weakref.proxy()
في الوصول لخاصية في الكائن المشار إليه في الخطأ بعد أن يكون جُمع في القمامة. لمعلومات أكثر عن التأشير الضعيف انظر الى الوحدة weakref
.
RuntimeError
يُطلق هذا الاستثناء عندما يُكتشف خطأٌ ما لا يقع ضمن أي تصنيفات أخرى. القيمة المرتبطة هي نص يشير لماذا حدث الخطأ على وجه التحديد.
StopIteration
يُطلق بواسطة الدالة الداخلية next()
وتابع المُكَرِر __next__()
للإشارة أنه لا يوجد عناصر أخرى يمكن إنتاجها باستخدام المُكَرِر. كائن الاستثناء يملك خاصية وحيدة value
، وتُمرر كوسيط عند بناء الاستثناء وتأخذ قيمة None
. عندما تعود دالة المولد أو coroutine، تُطلق نسخة من الاستثناء StopIteration
، والقيمة المُعادة من الدالة تُستخدم كمعامل value
للدالة البانية للاستثناء.
اذا عُرفت دالة المولد في حضور الموجه from __future__ import generator_stop
فهذا سيطلق StopIteration
، وسيحول الى RuntimeError
(مُحتفظًا بالاستثناء StopIteration
كمسبب للاستثناء الجديد).
التغييرات في إصدار بايثون 3.3: أُضيفت الخاصية value مع جعل دوال المولد تستخدمها لتعيد قيمة.
التغييرات في إصدار بايثون 3.5: قُدم التحويل للخطأ RuntimeError
.
StopAsyncIteration
يجب أن يُطلق بواسطة التابع __anext__()
الخاص بكائن المكرر غير المتزامن (asynchronous iterator) لإيقاف التكرار.
هذا الاستثناء جديدٌ في بايثون 3.5
SyntaxError
يُطلق عندما يكتشف المُفسِّر (parser) خطأً في الصيغة. قد يحدث ذلك في جملة الاستيراد، أو في استدعاء الدوال الداخلية exec()
أو eval()
، أو عند قراءة ملف السكربت أو مجرى الدخل القياسي.
نُسخ هذا الصنف تمتلك الخواص filename
و lineno
و offset
و text
لوصول أسهل للتفاصيل. يعيد التابع str()
في الاستثناء الرسالة فقط.
IndentationError
الصنف الأساسي لأخطاء الصيغة المتعلقة بالإزاحة غير الصحيحة. هذا الاستثناء هو صنف فرعي من الصنف SyntaxError
.
TabError
يُطلق عندما تحتوي الإزاحة على فراغات وعلامات جدولة متعارضة. هذا الاستثناء هو صنف فرعي من IndentationError
.
SystemError
يُطلق عندما يجد المُفسر خطأً داخليًا، ولكن الموقف لا يبدو عليه خطيرًا لدرجة فقدان الأمل. القيمة المرتبطة هي نص يشير إلى ما حدث من خطأ. يجب عليك تبليغ المسؤول عن صيانة ومتابعة مُفسر لغة بايثون المُثبّت لديك. تأكد من ذكر رقم نسخة مُفسر بايثون (يمكنك الحصول عليه من الخاصية sys.version
؛ تُطبع رقم النسخة أيضًا عن تشغيل جلسة بايثون تفاعلية) ورسالة الخطأ وإن أمكن مصدر البرنامج الذي أطلق الخطأ.
SystemExit
يُطلق هذا الاستثناء بواسطة الدالة sys.exit()
. يرث هذا الصنف من BaseException
بدلًا من Exception
حتى لا يُلتقط من الشيفرة التي تُعالج الاستثناء Exception
. هذا يسمح للاستثناء بالانتشار (propagate) بطريقة مناسبة وينهي تنفيذ المُفسر.
عندما لا يُعالج الاستثناء، فسينتهي تنفيذ مُفسر بايثون، ولا تُطبع سلسلة تتبع الاستثناءات (stack traceback). تقبل الدالة البانية نفس الوسيط المُمَرر للدالة sys.exit()
. إذا كانت القيمة رقم صحيح، تُحدد حالة خروج النظام (المُمَررة للدالة exit()
في لغة C)؛ إذا كانت None
، فستأخذ حالة خروج النظام القيمة 0 وإذا كانت نوع آخر مثل سلسلة نصية، فستُطبع قيمة الكائن وتصبح حالة خروج النظام 1.
يُحَوَّل استدعاء الدالة sys.exit()
إلى استثناءٍ حتى تُنفذ معالجات الخطأ (جملتي finally
و try
)، وحتى يُمكن للمنقح (debugger) تنفيذ سكربت ما دون فقدان التحكم في تنفيذه. من الممكن استخدام الدالة os._exit()
إذا كان من الضرورة القصوى الخروج حالًا (مثل الخروج من عملية ابن للعملية الحالية بعد استدعاء os.fork()
).
code
حالة الخروج أو رسالة الخطأ المُمَررة للدالة البانية (القيمة التلقائية هي None
).
TypeError
يُطلق عندما تُطبق دالة أو عملية على كائن من نوع غير مناسب. القيمة المرتبطة هي سلسلةٌ نصيةٌ تُعطي تفاصيل عدم تطابق النوع.
قد يُطلق هذا الاستثناء بواسطة شيفرة المستخدم مباشرةً للإشارة لعدم قابلية إجراء عملية على كائن. إذا كان الكائن يدعم إجراء عملية معينة لكنها غير مبرمجة بعد، فإن الاستثناء الأفضل لذلك هو NotImplementedError
.
تمرير وسائط ذات أنواع غير صحيحة (مثل تمرير قائمة [list] والمتوقع هو رقم صحيح) يجب أن يطلق الاستثناء TypeError
، ولكن تمرير وسائط بقيم غير صحيحة (مثل تمرير رقم خارج الحدود المتوقعة) يجب أن يُطلق الاستثناء ValueError
.
UnboundLocalError
يُطلق عندما يُشار إلى متغير محلي في دالة أو تابع ولكن لم تعطَ قيمةٌ لهذا المتغير بعد. هذا الاستثناء هو صنف فرعي من NameError
.
UnicodeError
يُطلق هذا الاستثناء عند حدوث خطأ ترميز أو فك ترميز يتعلق بيونيكود؛ وهو صنف فرعي من الصنف ValueError
.
يمتلك هذا الاستثناء خاصيات تشرح خطأ الترميز أو فك الترميز. فمثلًا، err.object[err.start:err.end]
يعطي المُدخل غير الصالح الذي فشل عنده الترميز.
encoding
اسم الترميز الذي أطلق الخطأ.
reason
نص يصف خطأ الترميز بالتفصيل.
object
الكائن الذي تم محاولة ترميزه أو فك ترميزه.
start
الفهرس الأول للبيانات غير الصالحة في الكائن.
end
الفهرس بعد آخر بيانات غير الصالحة.
UnicodeEncodeError
يُطلق عند حدوث خطأ ترميز. وهو صنف فرعي من UnicodeError
.
UnicodeDecodeError
يُطلق عند حدوث خطأ فك ترميز. وهو صنف فرعي من UnicodeError
.
UnicodeTranslateError
يُطلق عند حدوث خطأ ترميز خلال عملية التحويل. وهو صنف فرعي من UnicodeError
.
ValueError
يُطلق عندما تتسلم عملية داخلية أو دالة وسيط بنوع صحيح ولكن بقيمة غير مناسبة، ولا يوجد معلومات أكثر عن الخطأ من قبيل ظهور الاستثناء IndexError
مثلًا.
ZeroDivisionError
يُطلق عندما يكون الوسيط الثاني من عملية القسمة أو باقي القسمة هو صفر. القيمة المرتبطة هي نص يشير إلى نوع القيم التي تجرى عليها العملية والعملية.
الاستثناءات التالية بقيت من أجل التوافقية مع نُسخ بايثون السابقة، ابتداءً من بايثون 3.3، تُعتبر أسماءً بديلةً (aliases) للاستثناء OSError
.
EnvironmentError
IOError
WindowsError
متاحةٌ في نظام الويندوز فقط.
استثناءات نظام التشغيل
الاستثناءات التالية هي أصناف فرعية من الاستثناء OSError
وتُطلق بناءً على رقم الخطأ الصادر من النظام.
BlockingIOError
يُطلق عندما يُحجز كائنٌ (مثل socket
) من قبل عملية ما ويكون هذا الكائن مضبوطًا لعملية غير حاجزة (non-blocking). يرتبط هذا الاستثناء بأرقام الأخطاء التالية: EAGAIN
و EALREADY
و EWOULDBLOCK
و EINPROGRESS
.
بالاضافة لما تملكه الاستثناءات OSError
و BlockingIOError
من خاصيات، توجد خاصية واحدة إضافية وهي:
characters_written
هو رقم صحيح يحتوي على عدد المحارف التي كتُبت في stream
من قَبل حجزها. هذه الخاصية متاحة عند استخدام أصناف عمليات الإدخال والإخراج المحفوظة في الذاكرة المؤقتة والموجودة في وحدة io
.
ChildProcessError
يُطلق هذا الاستثناء عندما يفشل إجراء ما في عملية ابن (child process). يرتبط هذا الاستثناء برقم الخطأ ECHILD
.
ConnectionError
الصنف الأساسي للقضايا المتعلقة بالاتصال. الأصناف الفرعية من هذا الاستثناء هي BrokenPipeError
و ConnectionAbortedError
و ConnectionRefusedError
و ConnectionResetError
.
BrokenPipeError
هذا الاستثناء هو صنف فرعي من ConnectionError
، ويُطلق عند محاولة الكتابة في أنبوب (pipe) بينما تكون نهايته قد أُغلقت، أو عند محاولة الكتابة في socket
قد تم وقف الكتابة فيها. يرتبط هذا الاستثناء بأرقام الخطأ EPIPE
و ESHUTDOWN
.
ConnectionAbortedError
هذا الاستثناء هو صنف فرعي من ConnectionError
، ويُطلق عندما تُحبَط محاولة الاتصال من قبل الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ ECONNABORTED
.
ConnectionRefusedError
هذا الاستثناء هو صنف فرعي من ConnectionError
، ويُطلق عندما تُرفض محاولة الاتصال من الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ ECONNREFUSED
.
ConnectionResetError
هذا الاستثناء هو صنف فرعي من ConnectionError
، ويُطلق عندما يُعاد ضبط الاتصال من الطرف الأخر. يرتبط هذا الاستثناء برقم الخطأ ECONNRESET
.
FileExistsError
يُطلق عند محاولة إنشاء ملف أو مجلد موجود مُسبقًا. يرتبط هذا الاستثناء برقم الخطأ EEXIST
.
FileNotFoundError
يطلق هذا الاستثناء عندما يُطلب ملف أو مجلد ولكنه غير موجود. يرتبط هذا الاستثناء برقم الخطأ ENOENT
.
InterruptedError
يطلق هذا الاستثناء عند مقاطعة إستدعاء ما من قبل النظام بواسطة إشارة قادمة (incoming signal). يرتبط هذا الاستثناء برقم الخطأ EINTR.
التغييرات في إصدار بايثون 3.5: تُعيد بايثون استدعاءات النظام عندما تُقاطَع باستخدام إشارة قادمة، إلا إذا أَطلق مُعالج الإشارة استثناءً.
IsADirectoryError
يُطلق عندما تطلب دالةٌ تجري عمليةً على ملفٍ ما (مثل os.remove()
) مجلدًا ما. يرتبط هذا الاستثناء برقم الخطأ EISDIR
.
NotADirectoryError
يُطلق عندما تُستدعى دالةٌ تجري عمليةً على مجلدٍ ما (مثل (os.listdir(
) على متغير أو مُعَرف ليس بمجلد. يرتبط هذا الاستثناء برقم الخطأ ENOTDIR
.
PermissionError
يطلق عند محاولة تشغيل عملية دون وجود صلاحيات الوصول المناسبة لذلك، مثل أذونات ملفات النظام. يرتبط هذا الاستثناء برقم الخطأ EACCES
و EPERM
.
ProcessLookupError
يطلق عندما تكون العملية المُمَرَّرة غير موجودة. يرتبط برقم الخطأ ESRCH
.
TimeoutError
يُطلق عندما تنتهي مدة صلاحية دالة نظام على مستوى النظام. يرتبط هذا الاستثناء برقم الخطأ ETIMEDOUT
.
جميع الاستثناءات السابقة أُضيفت في بايثون 3.3 وهي أصناف فرعية من الصنف OSError
.
التحذيرات
تُستخدم الاستثناءات التالية كتحذيرات، انظر للوحدة warnings
لمزيد من المعلومات.
Warning
الصنف الأساسي لاستثناءات التحذيرات.
UserWarning
الصنف الأساسي للتحذيرات التي تُوَلدها شيفرة المستخدم.
DeprecationWarning
الصنف الأساسي لتحذيرات الميزات المُهملة (deprecated features).
PendingDeprecationWarning
الصنف الأساسي لتحذيرات الميزات التي ستُهمل في المستقبل.
SyntaxWarning
الصنف الأساسي للتحذيرات الخاصة بالصيغ المشكوك في صحتها.
RuntimeWarning
الصنف الأساسي للتحذيرات التي تظهر أثناء تنفيذ الشيفرة البرمجية.
FutureWarning
الصنف الأساسي للتحذيرات الخاصة بالدوال البانية التي ستتغير لُغويًا في المستقبل.
ImportWarning
الصنف الأساسي للتحذيرات الخاصة بالأخطاء المُحتملة أثناء استيراد الوحدات.
UnicodeWarning
الصنف الأساسي للتحذيرات الخاصة بالترميز.
BytesWarning
الصنف الأساسي للتحذيرات الخاصة بالنوعين bytes
و bytearray
.
ResourceWarning
الصنف الأساسي للتحذيرات الخاصة بحجم استخدام مصدر ما.
هذا الاستثناء جديدٌ في بايثون 3.2.