2012-07-10 3 views
6

में किसी भी प्रक्रिया के लिए System.Windows.Forms.Application.ThreadException के समतुल्य:कंसोल आवेदन या खिड़कियों सेवा या WinForms मैं उपयोग में सामान्य

  • System.Windows.Forms.Application.ThreadException
  • प्रणाली। विंडोज़.एप्लिकेशंस। अनहैंडेड एक्सेप्शन

गैर-विनफॉर्म बहु-थ्रेडेड एप्लिकेशन के लिए मुझे क्या उपयोग करना चाहिए?

सी # .NET 4.0 में नीचे पूरा कोड पर विचार करें: stackoverflow पर इसी तरह के सवाल का

using System; 
using System.Threading.Tasks; 

namespace ExceptionFun 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
      Task.Factory.StartNew(() => 
       { 
        throw new Exception("Oops, someone forgot to add a try/catch block"); 
       }); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      //never executed 
      Console.WriteLine("Logging fatal error"); 
     } 
    } 
} 

मैंने देखा है टन, लेकिन कोई भी एक संतोषजनक जवाब निहित। अधिकांश उत्तर प्रकार के होते हैं: "आपको अपने कोड में उचित निष्पादन हैंडलिंग शामिल करना चाहिए" या "AppDomain.CurrentDomain.UnhandledException का उपयोग करें"।

संपादित करें: ऐसा लगता है मेरे सवाल का गलत समझा गया था, इसलिए मैं इसे पुनर्निर्मित और एक छोटे कोड उदाहरण प्रदान की है।

+1

यह http://stackoverflow.com/questions/3133199/net-global-exception-handler-in-console-application – Jodrell

+1

का डुप्लिकेट की तरह दिखता है आम तौर पर लॉग अप करने के लिए वैश्विक अपवाद हैंडलर का उपयोग किया जाना चाहिए। यदि आप अपवाद के बारे में कुछ समझदार हैं तो आपको स्थानीय रूप से संभालना चाहिए। – Jodrell

+0

यह ठीक काम करना चाहिए। बेशक आप कोशिश/पकड़ का उपयोग नहीं करना चाहते हैं, जो अनचाहे एक्सेप्शन ईवेंट हैंडलर को चलने से रोकता है। आपको स्वयं डाई() की देखभाल करने की ज़रूरत नहीं है, यह स्वचालित है। –

उत्तर

0

आपको किसी समकक्ष की आवश्यकता नहीं है, CurrentDomain.UnhandledException ईवेंट बहु-थ्रेडेड कंसोल अनुप्रयोगों में ठीक काम कर रहा है। लेकिन यह आपके मामले में फायरिंग नहीं कर रहा है क्योंकि आप अपना धागा शुरू करते हैं। आपके प्रश्न में हैंडलर विंडोज और कंसोल अनुप्रयोगों दोनों में निष्पादित नहीं होगा। लेकिन अगर आप अपनी (उदाहरण के लिए) इस तरह थ्रेड प्रारंभ:

new Thread(() => { 
    throw new Exception("Oops, someone forgot to add a try/catch block"); 
}).Start(); 

यह आग जाएगा।

Task.Factory.StartNew(...) और CurrentDomain.UnhandledException समस्या SO पर कई पोस्टों में डिस्कवर की गई है। यहाँ कुछ सुझाव की जाँच करें:

How to handle all unhandled exceptions when using Task Parallel Library?

What is the best way to catch exception in Task?

संबंधित मुद्दे