سؤال

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

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

وأنا متأكد من شخص ما يجب أن تفعل شيئا في هذا الاتجاه من قبل، ولكني لم تنجح في تحويل ما يصل أي شيء يبدو مفيدا عن طريق البريد الإلكتروني.

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

المحلول

لتسجيل الإخراج القياسي، يمكنك استخدام المجمع المعياري، مثل هذا واحد:

from __future__ import with_statement

class OutWrapper(object):
    def __init__(self, realOutput, logFileName):
        self._realOutput = realOutput
        self._logFileName = logFileName

    def _log(self, text):
        with open(self._logFileName, 'a') as logFile:
            logFile.write(text)

    def write(self, text):
        self._log(text)
        self._realOutput.write(text)

وثم لديك لتهيئة في ملف بايثون الرئيسي الخاص بك (واحد أن يدير كل شيء):

import sys    
sys.stdout = OutWrapper(sys.stdout, r'c:\temp\log.txt')

وأما بالنسبة للاستثناءات تسجيل، وأسهل شيء نفعله هو أن يلف طريقة MainLoop من wx.App في try..except، ثم استخراج المعلومات استثناء، حفظه في بعض الطريق، ومن ثم إعادة رفع الاستثناء من خلال raise ، على سبيل المثال:

try:
    app.MainLoop()
except:
    exc_info = sys.exc_info()
    saveExcInfo(exc_info) # this method you have to write yourself
    raise

نصائح أخرى

لمعالجة الاستثناء، يتم فتح افتراض ملف السجل الخاص بك كما سجل:

import sys
import traceback

def excepthook(type, value, tb):
    message = 'Uncaught exception:\n'
    message += ''.join(traceback.format_exception(type, value, tb))
    log.write(message)

sys.excepthook = excepthook

ويمكنك استخدام

<اقتباس فقرة>   

وsys.excepthook

و(انظر بايثون مستندات )

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

وأما بالنسبة المعياري تسجيل - هي أفضل طريقة بالنسبة لي لكتابة شيء مماثل لOutWrapper DzinX ل

إذا كنت في مرحلة التصحيح، والنظر في التنظيف ملفات السجل الخاص بك بعد كل دخول. هذه الأضرار أداء الكثير، ولكن إذا كنت تدير ليسبب segfault في بعض الكامنة كود C، والسجلات الخاصة بك لا تضليل لك.

وهناك طرق مختلفة. يمكنك وضع كتلة try..catch في wxApplication :: OnInit، مع ذلك، أنه لن ينجح دائما مع جتك.

ووالبديل لطيفة أن يكون لتجاوز التطبيق :: HandleEvent في wxApplication فئة مشتقة الخاص بك، وكتابة رمز مثل هذا:

void Application::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& event) const
{
    try
    {
        wxAppConsole::HandleEvent(handler, func, event);
    }
    catch (const std::exception& e)
    {
        wxMessageBox(std2wx(e.what()), _("Unhandled Error"),
            wxOK | wxICON_ERROR, wxGetTopLevelParent(wxGetActiveWindow()));
    }
}

وانها ++ C سبيل المثال، ولكن هل يمكن أن تترجم بالتأكيد لبيثون بسهولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top