لا يمكن أن يكون fileLoadexception الذي أعتقد أنني أتعامل معه

StackOverflow https://stackoverflow.com/questions/4005876

سؤال

لدي موضوع يحصل على تهيئة مثل هذا:

Utility.Log("1");

myThread = new Thread(new ThreadStart(delegate
{
    Utility.Log("2");

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

أي أفكار حول كيف يمكنني تتبع هذا ، أو على الأقل لالتقاط الاستثناء بشكل صحيح؟

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

المحلول

FileLoadexception هو حادث خطير جدا. يتم رفعه عندما يحاول برنامج التحويل البرمجي JIT تجميع الكود الذي تقوم بتشغيله في موضوعك. لا يمكن لزوج المحاولة/الصيد التقاط هذا الاستثناء لأنه يتم تربيته قبل يبدأ الرمز في التنفيذ. وبعبارة أخرى ، فهي القنابل قبل يمكنك إدخال كتلة المحاولة. بالنظر إلى أن هذا موضوع ، لا يمكنك منع البرنامج من الانهيار إلى سطح المكتب. آخر اللحظات التي لديك هي appdomain.undrledexception ، فإن خاصية innerexception الخاصة بـ eExceptionObject تخبرك بما يحدث حقًا.

يجب أن يكون هذا الاستثناء دائمًا قابلاً للتثبيت بسهولة. إنها مشكلة في التكوين ، ويجد برنامج التحويل البرمجي JIT تجميعًا له رقم الإصدار الخاطئ أو هو إصدار قديم من التجميع ، شيء من هذا القبيل. إذا لم تتمكن من تشخيصه من AppDomain.UnhandledException ، فيمكن أن توضح لك أداة fuslogvw.exe كيف تجد التجميع الخاطئ. يجب أن تكون إعادة بناء كاملة لحلك في منتصف الطريق إلى الإصلاح.

نصائح أخرى

لقد نشرت جزءًا من الكود الخاص بك فقط ، وبالتالي فمن المستحيل الإجابة على سؤالك. إذن هذه نصيحة عامة.

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

public void MyMethod()
{
    _myThread = new Thread(WorkerThread);
    _myThread.Start();
}

public void WorkerThread(object state)
{
    try
    {
      Utility.Log("2");
    }
    catch (Exception e)
    {
       //log error
    }
}

الأصلي try..catch لن يتمسك بالتأكيد استثناءات في موضوعك الجديد ، فقط في الخيط الأصلي.

إذا كنت ترغب في تحديد ما يجري في خيط الطفل ، فسيتعين عليك إعطائه معالجة الاستثناء الخاصة به. يبدو أنك حاولت القيام بذلك لكل "لقد حاولت أيضًا لف جسم المندوب الكامل في أ try/catch"، ولكن ستكون هناك حاجة إلى رمز تم تغييره لتأكيد صوابه.

يجب أن تكون قادرًا أيضًا على تضييق هذا الأمر عن طريق تصحيح الأخطاء في خيط الطفل.

تحتاج إلى إضافة معالج حدث استثناء الموضوع:

ما عليك سوى إضافة المعالج قبل التطبيق.

المصدر من MSDN:

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms errors to go through
    // our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

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