سؤال

وأنا باستخدام واجهة مستخدم PyQt4. لقد إعادة توجيه ستدير إلى ملف السجل من أجل التصحيح سهلة وإصلاح الأعطال، ولكن الآن أنا بحاجة لعرض رسائل الخطأ إلى المستخدم عند حدوث خطأ.

وبلدي المسألة هي أنني بحاجة لالتقاط استثناء عندما يحدث ذلك، والسماح للمستخدم معرفة أنه حدث، ولكن لا يزال تدع traceback نشر إلى ستدير (أي ملف السجل).

إذا أفعل شيئا من هذا القبيل:

def updateResults(self):
    try:
        #code that updates the results
    except:
        #display error message box

وهذا سوف قبض على الاستثناء وليس برمجيات الإعلانات الازدياد إلى سجل خطأ.

هل هناك طريقة لتظهر للمستخدم رسالة ومن ثم الاستمرار في برمجيات الإعلانات الازدياد الخطأ؟

وهذا من شأنه أن العمل؟

except, e:
    #display error message box
    raise e

هل هناك طريقة أفضل لتحقيق هدفي؟

هل كانت مفيدة؟

المحلول

وأعتقد أنك تفكر في هذا بطريقة خاطئة. لك الخطأ ببساطة إلى تسجيل أكثر من ذلك أسفل الخط لا ينبغي أن يثير إعادة. الطريق cannonical للقيام بذلك في بيثون هو استخدام وحدة تسجيل. مقتبس من المستندات:

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)

...

try:
    # code
except:
    logging.debug('Something bad happened', exc_info=True)
    # display message box
    # raise (if necessary)

وهذا يعطي نظام تسجيل أكثر مرونة بكثير من الاعتماد على أخطاء تنتج عن sys.stdout. قد لا تحتاج إلى إعادة رفع الاستثناء إذا يمكنك استرداد من الاستثناء في بعض الطريق.

نصائح أخرى

وبالضبط، ولكن يمكنك فقط

raise

والتي سوف إعادة رفع باستثناء التعامل معها حاليا.

وبعض المعلومات الإضافية:

و(مع PyQt4) سوف تحتاج أيضا إلى rebind sys.excepthook إلى وظيفة الخاصة بك للقبض على جميع <م> uncaught الاستثناءات. خلاف ذلك باي كيوت ستطبع منهم فقط إلى وحدة، والتي قد لا يكون ما تحتاجه ...

import sys

def excepthook(exc_type, exc_val, tracebackobj):
    # do something useful with the uncaught exception
    ...

def main():
    # rebind excepthook
    sys.excepthook = excepthook
    ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top