قبض فقط بعض أخطاء وقت التشغيل في بيثون
-
05-07-2019 - |
سؤال
وأنا استيراد حدة مما يثير الخطأ التالي في بعض الشروط: RuntimeError: pyparted يتطلب الوصول الجذر
وأنا أعلم أنني يمكن أن تحقق لمجرد وصول الجذر قبل الاستيراد، ولكن أود أن أعرف كيفية التقاط هذا النوع spesific الخطأ عن طريق محاولة / باستثناء بيان للرجوع إليها في المستقبل. هل هناك أي طريقة للتمييز بين هذه RuntimeError وغيرها من الجهات التي يمكن أن تثار؟
المحلول
وأنا أعلم أنني يمكن أن تحقق لمجرد وصول الجذر قبل الاستيراد، ولكن أود أن أعرف كيفية التقاط هذا النوع spesific الخطأ عن طريق محاولة / باستثناء بيان للرجوع إليها في المستقبل. هل هناك أي طريقة للتمييز بين هذه RuntimeError وغيرها من الجهات التي يمكن أن تثار؟
اقتباس فقرة>إذا كان سبب الخطأ بسبب حالة معينة، ثم أعتقد أن أسهل طريقة للقبض على الخطأ هو اختبار للشرط، ويمكنك رفع خطأ أكثر تحديدا نفسك. بعد كل 'خطأ' موجود قبل أن يتم طرح الخطأ، لأنه في هذه الحالة لها مشكلة مع البيئة.
وأنا أتفق مع تلك المذكورة أعلاه - مطابقة النص على خطأ هو نوع من مخيف
.نصائح أخرى
ويمكنك التحقق من سمات استثناء لتمييزها عن استثناءات RuntimeError
المحتملة الأخرى. على سبيل المثال، إعادة رفع الخطأ إذا كان لا يطابق نص رسالة محددة مسبقا.
try:
import pypatred
except RuntimeError,e:
if e.message == 'RuntimeError: pyparted requires root access':
return 'pyparted - no root access'
raise
وبطبيعة الحال، مقارنة النص مباشرة هي مجرد مثال، هل يمكن البحث عن سلاسل فرعية شملت أو التعابير العادية.
وتجدر الإشارة إلى أن السمة .message
الاستثناءات هي إهمال بدءا بيثون 2.6 . يمكنك العثور على النص في .args
، عادة args[0]
.
و... ل2.6، يتم إهمال السمة message
لصالح السمة args
.
try:
import pyparted
except RuntimeError:
print('RuntimeError is raised')
raise
معالجة الاستثناء في البرنامج التعليمي .
وهذا الوضع يجب أن ينتج ImportError
في بلدي رأي. ويمكنك أن تفعل ذلك بنفسك:
try:
import pyparted
except RuntimeError as e:
raise ImportError(e)
نعم.
try:
import module
except RuntimeError:
pass
يتم تفسير والواردات وأي بيان آخر، فهي ليست خاصة. هل يمكن أن تفعل ل
if condition:
import module
try:
import ...
except RuntimeError:
# Do something
RuntimeError أثار عندما تم الكشف عن خطأ فليس " ر سقوط في أي من الفئات الأخرى
def foo():
try:
foo()
except RuntimeError, e:
print e
print " Runtime Error occurred due to exceeded maximum recursion depth "
وهذه هي الطريقة التي سنقوم قبض على RuntimeError الناجمة عن الحد العودية تجاوزت في بيثون
وإذا كنت ترغب في استدعاء الدالة على حد العودية يمكنك القيام بما يلي
import sys
def foo():
try:
foo()
except RuntimeError, e:
sys.setrecursionlimit(1200)
foo()
ولكن دائما هو غاية غير المستحسن لتغيير الحد العودية، ولكن يسمح للتغيرات صغيرة جدا في الحد العودية