معالجة الاستثناء الثعبان
يوفر الثعبان وظيفتين هامتين جدا لمعالجة الاستثناءات وأخطاء البرنامج الثعبان الذي يظهر في العملية. يمكنك استخدام هذه الميزة لبرامج بيثون التصحيح.
- معالجة الاستثناء: بيثون موقع تعليمي وصف محدد.
- تأكيد (التأكيدات): بيثون موقع تعليمي وصف محدد.
استثناءات بيثون القياسية
اسم استثناء | وصف |
---|---|
BaseException | الفئة الأساسية لجميع الاستثناءات |
SystemExit | طلب مترجم للخروج |
KeyboardInterrupt | العضو المقاطعة تنفيذ (عادة ما تدخل ^ C) |
استثناء | الفئة الأساسية خطأ عام |
StopIteration | مكرر أية قيم المزيد |
GeneratorExit | مولد (مولد) أن تخطر خروج غير طبيعي |
StandardError | كل من الفئة الأساسية القياسية المدمج في لاستثناءات |
ArithmeticError | كل العددية الفئة الأساسية خطأ |
FloatingPointError | خطأ في الحساب الفاصلة العائمة |
OverflowError | تجاوزت عمليات العددية الحد الأقصى |
ZeroDivisionError | بالإضافة إلى (أو معامل) صفر (جميع أنواع البيانات) |
AssertionError | فشل التأكيد |
AttributeError | هذا الكائن لا يوجد لديه ممتلكات |
EOFError | لا المدمج في المدخلات وصوله EOF علامة |
EnvironmentError | التشغيل الطبقة النظام الأساسي الخطأ |
IOError | عمليات الإدخال / الإخراج إلى فشل |
OSError | خطأ في نظام التشغيل |
WindowsError | فشل استدعاء نظام |
ImportError | استيراد وحدة / فشل كائن |
LookupError | استفسار قاعدة البيانات فئة غير صالح |
IndexError | دون هذا المؤشر تسلسل (رقم قياسي) |
KeyError | دون هذا التعيين الرئيسي |
MemoryError | خطأ ذاكرة سعة (لبيثون مترجم ليست قاتلة) |
NameError | غير معلنة / تهيئة الكائن (وليس الملكية) |
UnboundLocalError | وصول متغير محلي غير مهيأ |
ReferenceError | وقد الأجسام إشارة ضعيفة (إشارة ضعيفة) يحاول الوصول إلى جمع القمامة من |
RuntimeError | خطأ وقت التشغيل العام |
NotImplementedError | لم يتم تنفيذ طريقة |
خطأ قواعدي | خطأ في بناء الجملة بيثون |
IndentationError | خطأ البادئة |
TabError | التبويب والفضاء مزيج |
SystemError | خطأ في نظام مترجم عادة |
TypeError | نوع العملية غير صالح |
ValueError | الحجج الباطلة صدر في |
UnicodeError | الأخطاء المتعلقة يونيكود |
UnicodeDecodeError | فك يونيكود الخطأ |
UnicodeEncodeError | خطأ رمز Unicode |
UnicodeTranslateError | خطأ تحويل Unicode |
تحذير | الفئة الأساسية تحذير |
DeprecationWarning | تحذيرات حول ميزات إهمال |
FutureWarning | تغيرت تحذيرات حول الهيكل المستقبلي للدلالات |
OverflowWarning | التحذير من العمر روجت حول تلقائيا إلى عدد صحيح طويل (طويل) ل |
PendingDeprecationWarning | سيكون تحذيرا حول خصائص النفايات |
RuntimeWarning | (السلوك وقت التشغيل) تحذير السلوك وقت التشغيل المشبوهة |
SyntaxWarning | تحذيرات البنية مشبوهة |
UserWarning | يحذر جيل رمز المستخدم |
ما هو غير طبيعي؟
هذا الاستثناء هو الحدث الذي يحدث أثناء تنفيذ البرنامج، التي تؤثر على تنفيذ البرنامج العادي.
في ظل الظروف العادية، عندما برامج بيثون لا يعالج بشكل صحيح حدوث استثناء.
الاستثناء هو كائن بيثون يمثل خطأ.
يحدث استثناء عند تشغيل البرنامج النصي بيثون نحن بحاجة للقبض على التعامل معها، وإلا سيتم إنهاء البرنامج.
معالجة استثناء
يمكنك التقاط الاستثناء باستخدام حاول / باستثناء بيان.
حاول / باستثناء يستخدم بيان للكشف عن الأخطاء في كتلة المحاولة، بحيث باستثناء بيان للقبض على استثناء ومعالجة المعلومات.
إذا كنت لا تريد حدوث استثناء عند نهاية البرنامج، مجرد محاولة للقبض عليه في الداخل.
بناء الجملة:
وفيما يلي محاولة بسيطة .... إلا ... تركيب آخر:
try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生
يعمل محاولة، عند بدء بيان المحاولة و، سيتم وضع علامة الثعبان في سياق البرنامج الحالي، حتى أنه عندما يحدث خلل يمكن أن أعود إلى هنا، حاول الشرط يتم تنفيذ أولا، ما يحدث يعتمد المقبل على التنفيذ ما إذا كان هناك استثناء.
- إذا حدث استثناء عند محاولة تنفيذ عندما البيان بعد، الثعبان القفز إلى الوراء في محاولة لإجراء المطابقة الأول باستثناء بند هو استثناء، اكتمال معالجة استثناء، والتحكم في التدفق على من خلال البيان محاولة بأكمله (الوقت ما لم تتم معالجة استثناء ويؤدي جديدة الاستثناءات).
- في حالة حدوث خلل في بيان المحاولة بعد سنوات، ولكن لا مطابقة باستثناء بند، وسيقدم استثناء من الجزء العلوي من المحاولة، أو إلى الجزء العلوي من البرنامج (الذي سينتهي البرنامج، وطباعة رسالة خطأ الافتراضي).
- إذا حدث استثناء عند محاولة لا يتم تنفيذ الشرط، وسيتم تنفيذ الثعبان بيان آخر بعد البيان (إذا ثم آخر)، ثم تدفق التحكم من خلال البيان محاولة بأكمله.
أمثلة
هنا مثال بسيط، فإنه يفتح ملف، ومحتويات محتوى الملف هو مكتوب، وليس حدوث استثناء:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
إخراج البرنامج أعلاه:
$ python test.py 内容写入文件成功 $ cat testfile # 查看写入的内容 这是一个测试文件,用于测试异常!!
أمثلة
هنا مثال بسيط، فإنه يفتح ملف، ومحتويات كتابي في محتويات الملف، ولكن الملف لم يكن لديك إذن الكتابة، حدث استثناء:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
قبل تنفيذ التعليمات البرمجية من أجل تسهيل الاختبار، يمكننا أولا إزالة الوصول للكتابة إلى ملف testfile الأمر كما يلي:
chmod -w testfile
ثم تنفيذ التعليمات البرمجية أعلاه:
$ python test.py Error: 没有找到文件或读取文件失败
باستثناء من دون استخدام أي نوع من الاستثناء مع
يمكنك استخدام دون أي نوع الاستثناء باستثناء الأمثلة التالية:
try: 正常的操作 ...................... except: 发生异常,执行这块代码 ...................... else: 如果没有异常执行这块代码
فوق بطريقة محاولة، باستثناء بيان للقبض على جميع الاستثناءات التي تحدث. ولكن هذه ليست طريقة جيدة، من خلال هذا البرنامج لا يمكننا تحديد المعلومات استثناء محددة. لأنه يلتقط كل الاستثناءات.
وباستخدام أنواع متعددة من الاستثناءات إلا
يمكنك أيضا استخدام نفس باستثناء بيانات لمعالجة الاستثناءات متعددة، على النحو التالي:
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 ...................... else: 如果没有异常执行这块代码
محاولة-أخيرا بيان
محاولة-أخيرا بيان ما إذا كان استثناء يحدث من شأنها أن تؤدي رمز النهائية.
try: <语句> finally: <语句> #退出try时总会执行 raise
أمثلة
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") finally: print "Error: 没有找到文件或读取文件失败"
إذا قمت بفتح ملف ليس لديه الإذن الكتابة، خرج هو على النحو التالي:
$ python test.py Error: 没有找到文件或读取文件失败
ويمكن أيضا أن المثال نفسه أن يكتب على النحو التالي:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") try: fh.write("这是一个测试文件,用于测试异常!!") finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败"
عندما طرح استثناء في كتلة المحاولة، ومنع أخيرا من التعليمات البرمجية على الفور.
منع في نهاية المطاف جميع البيانات بعد تنفيذ، يتم تشغيل استثناء مرة أخرى والتنفيذ باستثناء كود كتلة.
محتويات المعلمة مختلفة عن الاستثناء.
المعلمات غير طبيعية
استثناء يمكن أن المعلمات، كما معلمات الإخراج المعلومات شذوذ.
يمكنك التقاط استثناء من خلال بيانات المعلمة باستثناء ما يلي:
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在这输出 Argument 的值...
متغيرات القيم الشاذة عادة ما تدرج في بيان استثناء استقبالا. المتغيرات في شكل من المجموعات قد تظهر قيمة واحدة أو أكثر.
الصفوف (tuple) عادة ما تحتوي على سلسلة الخطأ، رقم خاطئ، موقع خاطئ.
أمثلة
فيما يلي أمثلة من استثناء واحد التالية:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def temp_convert(var): try: return int(var) except ValueError, Argument: print "参数没有包含数字\n", Argument # 调用函数 temp_convert("xyz");
نتائج الإجراءات المذكورة أعلاه هي كما يلي:
$ python test.py 参数没有包含数字 invalid literal for int() with base 10: 'xyz'
الزناد غير طبيعي
يمكننا استخدام العبارة لرفع أنفسهم تحريك استثناء
رفع بناء الجملة كما يلي:
raise [Exception [, args [, traceback]]]
بيان الاستثناء هو نوع من استثناء (على سبيل المثال، NameError) المعلمة قيمة المعلمة غير طبيعية. هذه المعلمة اختيارية، إذا لم تقدم، فإن الحجة استثناء هي "لا شيء".
الوسيطة الأخيرة اختيارية (نادرا ما تستخدم في الممارسة)، إذا كان هناك كائن استثناء أثر.
أمثلة
استثناء يمكن أن يكون سلسلة، فئة أو كائن. استثناء بايثون التي تقدمها النواة، معظمها حالات الطبقة، وهي معلمة مثيل فئة.
تعريف بسيط جدا من استثناء، على النحو التالي:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
ملاحظة: لتكون قادرة على التقاط الاستثناء "إلا" يجب أن يكون البيان مفيدا لرمي نفسه كائن الفئة استثناء أو سلسلة.
على سبيل المثال، نحن التقاط أكثر من استثناء، "إلا" البيان كما يلي:
try: 正常逻辑 except "Invalid level!": 触发自定义异常 else: 其余代码
أمثلة
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def mye( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行 try: mye(0) // 触发异常 except "Invalid level!": print 1 else: print 2
تنفيذ التعليمات البرمجية أعلاه، والناتج هو:
$ python test.py Traceback (most recent call last): File "test.py", line 11, in <module> mye(0) File "test.py", line 7, in mye raise Exception("Invalid level!", level) Exception: ('Invalid level!', 0)
استثناءات المعرفة
من خلال خلق طبقة جديدة استثناء، البرنامج قد اسم الاستثناءات الخاصة بهم. يجب أن تكون موروثة استثناءات نموذجية من الطبقة استثناء، سواء بشكل مباشر أو غير مباشر.
يلي يرتبط المثال المثال RuntimeError إنشاء فئة، الفئة الأساسية هي RuntimeError، لإخراج معلومات إضافية عندما يتم تشغيل استثناء.
في كتلة المحاولة، المستخدم ينفذ بيان كتلة إلا استثناء العرف، ويستخدم البريد متغير لخلق حالات من الدرجة Networkerror.
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
بعد تعريف الفئات المذكورة أعلاه، يمكنك تحريك استثناء، على النحو التالي:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args