اذهب إلى المحتوى
  • 0

كيف أحصل على معلومات exception في بايثون؟

MaxReve

السؤال

أحتاج إلى الحصول على المعلومات مثل نوع الخطأ واسم الملف ورقم السطر من exception التالي:

Traceback (most recent call last):
  File "c:/tmp.py", line 1, in <module>
    4 / 0
ZeroDivisionError: integer division or modulo by zero

أي أنني أريد شيفرة برمجية للحصول على هذه المعلومات:

ZeroDivisonError, tmp.py, 1

فكيف يمكنني فعل ذلك؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

هنالك عدّة طرق للحصول على المعلومات التي تحتاجها من except في بايثون، فيمكنك على سبيل المثال استخدام وحدات sys وos وبعد ذلك الحصول على المعلومات التي تحتاجها من دالة exc_info() وعلى الملف الذي تريده من دالة path ومن ثم من أول عنصر من exc_tb.tb_frame.f_code.co_filename كما في المثال التالي:

import sys, os

try:
    raise NotImplementedError("No error")
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print(exc_type, fname, exc_tb.tb_lineno)

يوجد حل آخر أقصر من الأول وهو استخدام مكتبات traceback وos.path لطباعة المعلومات التي تريدها كالتالي:

try:
    bla
except Exception as e:
    import traceback, os.path
    top = traceback.extract_stack()[-1]
    print ', '.join([type(e).__name__, os.path.basename(top[0]), str(top[1])])
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الإجابة السابقة ستعطيك حل خاص لمشكلتك. سأعطيك الآن حلًّا عامًّا لطباعة تتبع المكدس Stack trace لاستثناء ما. توفر الوحدة traceback في بايثون كل ماتحتاجه لذلك.

الهيكل العام لتتبع المكدس لاستثناء:

Traceback for the most recent call. # تتبع آخر استدعاء
Location of the program. # موقع البرنامج
Line in the program where the error was encountered. # السطر الذي حدث فيه الخطأ
Name of the error: relevant information about the exception. # اسم الخطأ: معلومات ذات صلة بالاستثناء. 

مثال:

Traceback (most recent call last):
  File "C:/Python27/hdg.py", line 5, in 
    value=A[5]
IndexError: list index out of range

الطريقة الأولى: باستخدام الدالة print_exc:

traceback.print_exc(limit=None, file=None, chain=True)

إذا كانت limit موجبة
مثال:

import traceback
# نعرّف مصفوفة
A = [1, 2, 3, 4]
# معالجة الاستثناء
try:
	value = A[5]
except:
	# طباعة تتبع المكدس
	traceback.print_exc()
# لإظهار أن البرنامج يستمر بشكل طبيعي بعد معالجة استثناء  try-except رسالة خارج كتلة
print("end of program")

الخرج:

Traceback (most recent call last):
  File "C:/Python27/hdg.py", line 8, in 
    value=A[5]
IndexError: list index out of range
end of program

 

الطريقة الثانية: باستخدام print_exception.

traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True)

مثال:

import traceback
import sys
a = 4
b = 0
# معالجة الاستثناء
# سنقسم على صفر
try:
	value = a / b
except:
	# طباعة المسار
	traceback.print_exception(*sys.exc_info())
print("end of program")

الخرج:

Traceback (most recent call last):
  File "C:/Python27/hdg.py", line 10, in 
    value=a/b
ZeroDivisionError: integer division or modulo by zero
end of program

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...