لماذا .صافي استثناء لا يتم صيدها بواسطة try/catch?

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

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أعمل على مشروع باستخدام ANTLR محلل مكتبة C#.لقد بنيت قواعد تحليل بعض النصوص و هو يعمل بشكل جيد.ومع ذلك ، عندما محلل يأتي عبر غير قانونية أو غير متوقعة رمزية ، فإنه يلقي واحدة من العديد من الاستثناءات.المشكلة هي أنه في بعض الحالات (وليس كل) أن بلدي try/catch لن قبض عليه وبدلا من ذلك توقف التنفيذ كما حدث استثناء غير معالج.

المسألة بالنسبة لي هي أنني لا أستطيع تكرار هذه المسألة في أي مكان آخر ولكن في كامل المدونة.مكدس الاستدعاءات يدل على أن الاستثناء بالتأكيد يحدث داخل بلدي حاول/catch(استثناء) كتلة.الشيء الوحيد الذي يمكنني التفكير به هو أن هناك عدد قليل من ANTLR الجمعية المكالمات التي تحدث بين وقانون رمي استثناء هذه المكتبة لا يكون التصحيح تمكين لذلك لا أستطيع خطوة من خلال ذلك.أنا أتساءل عما إذا كان غير debuggable الجمعيات تحول دون استثناء محتدما?مكدس الاستدعاءات يبدو مثل هذا ؛ الخارجية تناشد الجمعية في Antlr.وقت التشغيل:

    Expl.Itinerary.dll!TimeDefLexer.mTokens() Line 1213 C#
    Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xfc bytes 
    Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x22c bytes   
    Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 1) + 0x68 bytes
    Expl.Itinerary.dll!TimeDefParser.prog() Line 109 + 0x17 bytes   C#
    Expl.Itinerary.dll!Expl.Itinerary.TDLParser.Parse(string Text = "", Expl.Itinerary.IItinerary Itinerary = {Expl.Itinerary.MemoryItinerary}) Line 17 + 0xa bytes C#

مقتطف الشفرة من أسفل معظم الدعوة في تحليل() يبدو مثل:

     try {
        // Execution stopped at parser.prog()
        TimeDefParser.prog_return prog_ret = parser.prog();
        return prog_ret == null ? null : prog_ret.value;
     }
     catch (Exception ex) {
        throw new ParserException(ex.Message, ex);
     }

إلى أن قبض (استثناء) شرط يجب أن القبض على أي استثناء على الإطلاق.هل هناك أي سبب لماذا لا ؟

تحديث: أنا تتبعت من خلال التجميع الخارجية مع عاكس العثور على أي دليل على خيوط على الإطلاق.الجمعية يبدو أن يكون مجرد وقت تشغيل الأداة المساعدة فئة ANTLR هو التعليمات البرمجية التي تم إنشاؤها.الاستثناء الذي تم من TimeDefLexer.mTokens (طريقة) و هذا النوع هو NoViableAltException ، التي تستمد من RecognitionException -> استثناء.هذا الاستثناء هو عندما القيت lexer لا يمكن فهم رمز المقبل في تيار ، وبعبارة أخرى, إدخال غير صالح.هذا الاستثناء هو المفترض أن يحدث ، ومع ذلك فإنه يجب أن يتم القبض عليهم من قبل بلدي try/catch.

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

أكثر شيء واحد, لقد عدلت الأصلي try/catch في السؤال بدلا قبض NoViableAltException ، والقضاء على أي ميراث الارتباك.أنا لا تزال تلقى نفس النتيجة.

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

يا رجل, أنا لا تزال الحيرة!أنا لم أذكر ذلك من قبل ، ولكن أنا على التوالي مقابل 2008 و كل رمز هو 3.5.الخارجية الجمعية 2.0.أيضا, بعض من مدونة فرعية فئة في 2.0 الجمعية.أن عدم تطابق إصدار يسبب هذه المشكلة ؟

تحديث 2: كنت قادرا على القضاء .صافي النسخة الصراع من خلال ترقية الأجزاء ذات الصلة من بلدي .NET framework 3.5 رمز .NET 2.0 المشروع تكرار نفس السيناريو.كنت قادرا على تكرار نفس استثناء غير معالج عند تشغيل باستمرار في .NET 2.0.

تعلمت أن ANTLR وقد صدر مؤخرا 3.1.لذا ترقية من 3.0.1 و محاكمته.اتضح الشفرة التي تم إنشاؤها قليلا بتعميل الترميز ، ولكن نفس استثناء غير معالج يحدث في حالات الاختبار.

تحديث 3: لقد تكرار هذا السيناريو في تبسيط VS 2008 المشروع.لا تتردد في تحميل و لتفقد المشروع لنفسك.لقد طبقت جميع الاقتراحات كبيرة ، ولكن لم تكن قادرة على التغلب على هذه العقبة حتى الآن.

إذا كان يمكنك العثور على الحل من فضلك لا تبادل النتائج الخاصة بك.شكرا مرة أخرى!


شكرا لك ولكن VS 2008 تلقائيا فواصل على الاستثناءات غير المعالجة.أيضا لا يكون التصحيح->الاستثناءات الحوار.على NoViableAltException أن يتم طرح هو المقصود تماما, و تهدف إلى أن تكون اشتعلت من قبل رمز المستخدم.لأنه لم يتم القبض كما هو متوقع ، تنفيذ البرنامج توقف بشكل غير متوقع كما حدث استثناء غير معالج.

الاستثناء طرح مشتق من استثناء وليس هناك متعدد خيوط يحدث مع ANTLR.

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

المحلول

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

في 3 حالة من إعدادها في صورة جاهزة وأعتقد أن كنت تحصل على الرسالة التالية:"NoViableAltException كان غير معالج من قبل رمز المستخدم" و مكدس الاستدعاءات التي تبدو مثل هذا:

         [External Code]    
    >   TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes   C#
        [External Code] 
        TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes    C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C#
        [External Code] 

إذا كنت انقر على الحق في مكدس الاستدعاءات نافذة تشغيل بدوره على إظهار رمز خارجي ترى هذا:

        Antlr3.Runtime.dll!Antlr.Runtime.DFA.NoViableAlt(int s = 0x00000000, Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x80 bytes   
        Antlr3.Runtime.dll!Antlr.Runtime.DFA.Predict(Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x21e bytes  
    >   TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes   C#
        Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xc4 bytes 
        Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x147 bytes   
        Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 0x00000001) + 0x2d bytes  
        TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes    C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C#
        [Native to Managed Transition]  
        [Managed to Native Transition]  
        mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x39 bytes    
        Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2b bytes  
        mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x3b bytes   
        mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x81 bytes    
        mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x40 bytes

المصحح رسالة تخبرك بأن استثناء الصادرة من خارج التعليمات البرمجية الخاصة بك (من NoViableAlt) هو الذهاب من خلال الكود الخاص في TestAntlr-3.1.exe!TimeDefLexer.mTokens() دون أن يجري التعامل معها.

صيغة الأمر مربكا ولكن هذا لا يعني استثناء هو غير مسك.المصحح هو السماح تعلمون أن الكود الخاص mTokens()" يجب أن تكون قوية ضد هذا الاستثناء التي القيت خلال ذلك.

الأشياء للعب مع أن ترى كيف يبدو هذا بالنسبة لأولئك الذين لم إعدادها في صورة جاهزة المشكلة:

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

نصائح أخرى

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

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

using System.Threading;

...

void Application_ThreadException(object sender, ThreadExceptionEventArgs e) {
  throw new ParserException(e.Exception.Message, e.Exception);
}    

 ...

 var exceptionHandler = 
    new ThreadExceptionEventHandler(Application_ThreadException);
 Application.ThreadException += exceptionHandler;
 try {
    // Execution stopped at parser.prog()
    TimeDefParser.prog_return prog_ret = parser.prog();
    return prog_ret == null ? null : prog_ret.value;
 }
 catch (Exception ex) {
    throw new ParserException(ex.Message, ex);
 }
 finally {
    Application.ThreadException -= exceptionHandler;
 }

هل تستخدم .Net framework 1.0 أو 1.1?إذا كان الأمر كذلك ثم قبض(Exception ex) لن قبض استثناءات من التعليمات البرمجية غير المدارة.سوف تحتاج إلى استخدام catch {} بدلا من ذلك.راجع هذه المقالة للمزيد من التفاصيل:

http://www.netfxharmonics.com/2005/10/net-20-trycatch-and-trycatchexception/

أستطيع أن أقول لك ما يحدث هنا...

Visual Studio هو كسر لأنه يعتقد استثناء غير معالج.ماذا غير معالج يعني ؟ حسنا, في Visual Studio ، هناك وضع في أدوات...خيارات...التصحيح...العامة..."تمكين مجرد رمز مدارة (فقط)".إذا كان هذا هو التحقق إذا كان الاستثناء تنتشر من التعليمات البرمجية الخاصة بك إلى إطار مكدس المرتبطة استدعاء الأسلوب موجود في الجمعية وهو "ليس التعليمات البرمجية" (على سبيل المثال ، Antlr), التي تعتبر "غير المعالجة".أنا إيقاف تمكن مجرد رمز ميزة لهذا السبب.ولكن لو سألتني هذا هو عرجاء...دعونا نقول كنت تفعل هذا:

ExternalClassNotMyCode c = new ExternalClassNotMyCode();
try {
    c.doSomething( () => { throw new Exception(); } );
}
catch ( Exception ex ) {}

doSomething المكالمات الخاصة بك وظيفة مجهول هناك أن وظيفة يطرح استثناء...

لاحظ أن هذا هو "استثناء غير معالج" وفقا Visual Studio إذا "تمكين مجرد رمز" على.لاحظ أيضا أن يتوقف كما لو كانت توقف عندما تكون في وضع التصحيح ، ولكن في غير التصحيح أو بيئة الإنتاج ، رمز صالحة تماما و يعمل كما هو متوقع.أيضا, إذا كنت مجرد "تواصل" في المصحح التطبيق يذهب على أنها وسيلة مرح (لا تتوقف عن الموضوع).يعتبر "غير معالج" لأن الاستثناء تنتشر من خلال كومة الإطار الذي ليس في التعليمات البرمجية الخاصة بك (أي ، في مكتبة خارجي).إذا كنت تسأل لي, هذا هو رديء.الرجاء تغيير هذا السلوك الافتراضي Microsoft.هذا هو تماما صالحة حالة استخدام الاستثناءات برنامج التحكم المنطق.في بعض الأحيان لا يمكنك تغيير طرف ثالث مكتبة في التصرف بأي طريقة أخرى ، و هذا هو وسيلة مفيدة جدا لإنجاز العديد من المهام.

تأخذ MyBatis على سبيل المثال ، يمكنك استخدام هذه التقنية معالجة السجلات التي يتم جمعها عن طريق دعوة SqlMapper.QueryWithRowDelegate.

هل من الممكن أن الاستثناء التي القيت في آخر الموضوع ؟ ومن الواضح أن الاتصال الخاص بك هو رمز واحدة مترابطة ، ولكن ربما المكتبة كنت تستهلك يفعل بعض مؤشرات العمليات تحت الأغطية.

أنا مع @شون أوستن - محاولة التفاف حاول مع اسم مؤهل بشكل كامل

catch (System.Exception)

وانظر إذا كان ذلك يساعد.لا ANTLR دكتور يقول ما الاستثناءات يجب أن يكون القيت ؟

إلى أن قبض (استثناء) شرط يجب أن القبض على أي استثناء على الإطلاق.هل هناك أي سبب لماذا لا ؟

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

بلدي try/catch لن قبض عليه وبدلا من ذلك توقف التنفيذ كما حدث استثناء غير معالج.

تحتاج إلى العثور على ما يسبب خروج العملية.قد يكون شيئا آخر من حدث استثناء غير معالج.قد تحاول استخدام مصحح أصلي مع نقطة توقف على مجموعة "{,,kernel32.dll}ExitProcess".ثم استخدام SOS لتحديد ما البرمجية المدارة يدعو الخروج العملية.

أنا شخصيا لست مقتنع خيوط نظرية على الإطلاق.

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

لذا باختصار ، هناك آخر نوع الاستثناء في مساحة الاسم التي تستخدم في هذا الفصل ؟

تحرير:طريقة سريعة للتحقق من هذا هو التأكد في اللحاق بك شرط بالكامل التأهل استثناء نوع "النظام.استثناء" و جرب!

EDIT2:حسنا لقد حاولت رمز بالهزيمة الآن.سوف يكون لديك نظرة أخرى في الصباح إذا لم تصل إلى حل.

اممم, أنا لا أفهم المشكلة.أنا تحميل وحاولت المثال الخاص بك حل الملف.

يتم طرح استثناء في TimeDefLexer.cs, خط 852 ، والتي يتم بعد ذلك التعامل معها من قبل كتلة catch في البرنامج.cs تقول معالجة الاستثناء.

إذا كنت uncomment كتلة catch فوقه ، وسوف تدخل تلك الكتلة بدلا من ذلك.

ما المشكلة هنا ؟

كما Kibbee قال Visual Studio سوف تتوقف على استثناءات ، ولكن إذا كنت تسأل إلى مواصلة الاستثناء سوف ننشغل بها الكود الخاص بك.

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

هذا القائمة البريدية البريد مناقشة ما يبدو أن نفس المشكلة التي تواجهها.

من هناك, لقد تم إضافة بضع دمية الطبقات في البرنامج الرئيسي.cs الملف:

class MyNoViableAltException : Exception
{
    public MyNoViableAltException()
    {
    }
    public MyNoViableAltException(string grammarDecisionDescription, int decisionNumber, int stateNumber, Antlr.Runtime.IIntStream input)
    {
    }
}
class MyEarlyExitException : Exception
{
    public MyEarlyExitException()
    {
    }

    public MyEarlyExitException(int decisionNumber, Antlr.Runtime.IIntStream input)
    {
    }
}

ثم أضاف باستخدام خطوط في TimeDefParser.cs TimeDefLexer.cs:

using NoViableAltException = MyNoViableAltException;
using EarlyExitException = NoViableAltException; 

مع أن الاستثناءات قد فقاعة في وهمية استثناء فئات يمكن التعامل معها هناك ، ولكن كان لا يزال هناك استثناء التي القيت في mTokens الأسلوب في TimeDefLexer.cs.التفاف في محاولة الصيد في تلك الفئة اشتعلت استثناء:

            try
            {
                alt4 = dfa4.Predict(input);
            }
            catch
            {
            }

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

أنا تحميل الكود الخاص بك و كل شيء يعمل كما هو متوقع.

مصحح الأخطاء Visual Studio بشكل صحيح وقراءتها جميع الاستثناءات.قبض كتل تعمل كما هو متوقع.

انا نظام التشغيل Windows server 2003 المزود بحزمة الخدمة SP2 ، VS2008 فريق مجموعة (9.0.30729.1 SP)

حاولت تجميع أنت المشروع .NET 2.0, 3.0 & 3.5

@ستيف شتاينر ، المصحح الخيارات التي ذكرتها لا علاقة لها مع هذا السلوك.

حاولت أن تلعب مع هذه الخيارات مع عدم وجود آثار واضحة - قبض كتل تمكنت من اعتراض جميع الاستثناءات.

ستيف شتاينر هو الصحيح أن الاستثناء هو منشؤها في antlr مكتبة, مرورا mTokens (طريقة) و الوقوع في antlr المكتبة.المشكلة هي أن هذه الطريقة هي التي يتم إنشاؤها تلقائيا بواسطة antlr.ولذلك ، فإن أي تغييرات على التعامل مع الاستثناء في mTokens() سوف تكون الكتابة عندما تولد محلل/lexer الطبقات.

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

إضافة هذا الرمز إلى القواعد (.ز) الملف.سوف تحتاج أيضا إلى إيقاف "تمكين مجرد رمز" في التصحيح القائمة.

@members {

    public override Object RecoverFromMismatchedSet(IIntStream input,RecognitionException e,    BitSet follow)  
    {
        throw e;
    }
}

@rulecatch {
    catch (RecognitionException e) 
    {
        throw e;
    }
}

هذه هي محاولتي في C# نسخة من المثال المذكور في "الخروج من recogniser على الخطأ الأول" الفصل "نهائي ANTLR المرجع" كتاب.

نأمل أن يكون هذا هو ما كنت تبحث عنه.

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

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

Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);

 // Catch all unhandled exceptions in all threads.
 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);

و في إشارة إلى ما Kibbee قال ؛ إذا قمت بتحديد التصحيح|الاستثناءات في مقابل فقط انقر فوق كافة خانات في طرح' عمود يجب اختيار كل شيء حتى AFAIK باعتباره أول فرصة استثناء' ، أيمقابل تبين عندما استثناء عن سيتم تجهيزها قبل كل شيء آخر وكسر على رمز ذات الصلة.هذا من شأنه أن يساعد مع التصحيح.

أفضل خيار يبدو الإعداد Visual Studio لكسر على جميع الاستثناءات غير المعالجة (التصحيح -> الاستثناءات الحوار ، حدد مربع الاختيار "وقت تشغيل اللغة العامة الاستثناءات" وربما غيرها أيضا).ثم تشغيل البرنامج في وضع التصحيح.عندما ANTLR محلل رمز يطرح استثناء يجب أن تكون اشتعلت من قبل Visual Studio يسمح لك أن ترى أين هو حدوث نوع الاستثناء ، إلخ.

بناء على الوصف ، catch يبدو أن يكون صحيحا ، لذلك واحدة من العديد من الأشياء التي يمكن أن يحدث:

  1. محلل ليست في الواقع رمي استثناء
  2. المحلل في نهاية المطاف رمي شيء ليس المستمدة من النظام.استثناء
  3. هناك استثناء التي القيت على آخر الصفحات التي لا يتم التعامل معها

يبدو أنك قد استبعد قضية #3.

أنا تتبعت من خلال التجميع الخارجية مع عاكس العثور على أي دليل على خيوط على الإطلاق.

لا يمكنك العثور على أي خيوط لا يعني عدم وجود خيوط

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

من الأمثلة الصارخة أشياء مثل ThreadPool.QueueUserWorkItem, ولكن هناك الكثير والكثير من الأشياء الأخرى التي يمكن أيضا تشغيل الأشياء في تجمع مؤشرات الترابط التي لا تبدو واضحة ، مثل مندوب.BeginInvoke

حقا, تحتاج إلى هل ما يوحي kibbee.

وقد حاولت طباعة (وحدة التحكم.WriteLine()) استثناء داخل القبض شرط ، وليس استخدام visual studio وتشغيل التطبيق الخاص بك على وحدة ؟

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

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

يتواجد شكرا على مساعدة الجميع!

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

هذا هو زائف.هذه تستخدم في صيد جميع الاستثناءات غير المعالجة في .NET 1.0/1.1 ولكن كان الخلل و لم يكن من المفترض أن و كانت ثابتة في .NET 2.0.

AppDomain.CurrentDomain.UnhandledException 

المقصود فقط أن تستخدم بمثابة آخر فرصة تسجيل الصالون حتى تتمكن من تسجيل الدخول الاستثناء قبل إنهاء البرنامج.لن قبض على استثناء من 2.0 بعده (على الرغم من أن في .NET 2.0 على الأقل هناك config قيمة يمكنك تعديل لجعلها تتصرف مثل 1.1 ولكنها ليست الممارسة الموصى بها لاستخدام هذا.).

من الجدير بالذكر أن هناك بعض الاستثناءات التي لا التقاط مثل StackOverflowException و OutOfMemoryException.وإلا كما واقترح الآخرين قد تكون استثناء في خلفية الموضوع في مكان ما.أيضا أنا متأكد من أنك لا يمكن التقاط بعض/كل المدارة/الأم الاستثناءات سواء.

أنا لا أفهم...اللحاق بك كتلة يلقي مجرد استثناء جديد (مع نفس الرسالة).وهذا يعني أن البيان:

المشكلة هي أنه في بعض الحالات (وليس كل) أن بلدي try/catch لن قبض عليه وبدلا من ذلك توقف التنفيذ كما حدث استثناء غير معالج.

هو بالضبط ما هو من المتوقع أن يحدث.

أنا أتفق مع دانيال مثقب و kronoz أن هذه الروائح مثل الاستثناء الذي قد تفعل شيئا مع المواضيع.أبعد من ذلك ، وهنا أسئلة أخرى:

  1. ما معنى رسالة الخطأ كاملة القول ؟ ما نوع الاستثناء ؟
  2. على أساس تتبع المكدس لقد قدمت هنا ليست استثناء القيت من قبل لك رمز في TimeDefLexer.mTokens()?

لست متأكدا إذا أنا غير واضح, ولكن أنا أرى المصحح وقف التنفيذ مع "استثناء غير معالج" من نوع NoViableAltException.في البداية لم أكن أعرف أي شيء عن هذا التصحيح->الاستثناءات القائمة البند لأن MS كنت تتوقع ، في مقابل تثبيت الوقت إلى الالتزام الشخصي عندما يكون لديك أي فكرة كيف أنها مختلفة.على ما يبدو ، لم أكن على C# ديف الشخصي و كان في عداد المفقودين هذا الخيار.أخيرا بعد التصحيح طرح كل CLR الاستثناءات ، ومما يؤسف له أنني غير قادر على اكتشاف أي سلوك يؤدي إلى سبب هذا استثناء غير معالج المسألة.كل استثناءات من المتوقع و من المفترض أن يتم التعامل معها في try/catch.

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

لدي مسألة مفتوحة مع ANTLR الناس لذلك ربما كانوا قادرين على معالجة هذه المشكلة من قبل.لقد كنت قادرا على تكرار ذلك في وحدة تحكم بسيطة المشروع باستخدام التطبيق .NET 2.0 و 3.5 تحت VS 2008 VS 2005.

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

@spoulson,

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

إذا كنت لم تستخدم WinDBG قبل ، يمكن أن يكون قليلا الساحق, ولكن هنا تعليمي جيد:

http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx

بمجرد بدء WinDBG ، يمكنك تبديل كسر الاستثناءات غير المعالجة عن طريق الذهاب إلى التصحيح->الحدث المرشحات.

إذا التقارير حتى الآن ، 2 يعمل بشكل صحيح, و 1 من ذوي الخبرة مسألة ذكرت.ما هي إصدارات ويندوز ، Visual Studio المستخدمة .NET framework مع بناء الأرقام ؟

أنا تشغيل XP SP2 VS 2008 Team Suite (9.0.30729.1 SP), C# 2008 (91899-270-92311015-60837)،.NET FRAMEWORK 3.5 المزود بحزمة الخدمة SP1.

إذا كنت تستخدم كائنات com المشروع الخاص بك ومحاولة قبض كتل لا يمسك الاستثناءات سوف تكون بحاجة إلى تعطيل أدوات/التصحيح/استراحة عندما الاستثناءات عبر AppDomain أو المدارة/الأم حدود مدارة(فقط) الخيار.

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