c# কনসোল অ্যাপ্লিকেশন মধ্যে.NET গ্লোবাল ব্যতিক্রম হ্যান্ডলার




vb.net exception-handling (4)

প্রশ্ন: আমি আমার কনসোল অ্যাপ্লিকেশনে অসংলগ্ন ব্যতিক্রমগুলির জন্য একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার সংজ্ঞায়িত করতে চাই। এএসপিএইচ এ, গ্লোবাল.এক্সএক্স, এবং উইন্ডোজ অ্যাপ্লিকেশন / পরিষেবাদিতে একটিকে সংজ্ঞায়িত করতে পারেন, নীচের হিসাবে সংজ্ঞায়িত করতে পারেন

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);

কিন্তু কিভাবে আমি একটি কনসোল অ্যাপ্লিকেশন জন্য একটি গ্লোবাল ব্যতিক্রম হ্যান্ডলার নির্ধারণ করতে পারেন?
বর্তমান ডোমেইন কাজ করতে মনে হচ্ছে না (.নেট 2.0)?

সম্পাদনা:

Argh, বোকা ভুল।
VB.NET তে, বর্তমান ডোমাইনের সামনে "অ্যাডহ্যান্ডলার" কীওয়ার্ড যুক্ত করতে হবে, নাকি অন্য কেউ অন্তালসেন্সে UnhandledException ইভেন্ট দেখতে পাচ্ছেন না ...
যে কারণ VB.NET এবং C # কম্পাইলার ইভেন্টটি হ্যান্ডলিং ভিন্নভাবে আচরণ করে।


যদি আপনার একটি একক-থ্রেডেড অ্যাপ্লিকেশন থাকে, তবে আপনি মুখ্য ফাংশনে একটি সাধারণ চেষ্টা / ধরা ব্যবহার করতে পারেন, তবে এটি মূল ফাংশনের বাইরে অন্য থ্রেডগুলির বাইরে নিক্ষিপ্ত ব্যতিক্রমগুলি অন্তর্ভুক্ত করে না, উদাহরণস্বরূপ মন্তব্য)। এই কোডটি কীভাবে ব্যতিক্রমটিকে অ্যাপ্লিকেশনটি বন্ধ করে দিতে পারে তা আপনি কীভাবে মুখ্যতে পরিচালনা করার চেষ্টা করেছেন তাও প্রদর্শন করে (কীভাবে প্রোগ্রামটি চিত্তাকর্ষকভাবে প্রস্থান করে দেখায় এবং অ্যাপ্লিকেশনটির ব্যতিক্রম হওয়ার আগে চিত্তাকর্ষকভাবে প্রস্থান করার মঞ্জুরি দেয়, তবে যদি আপনি এটি চালাতে দেন , এটি বেশ অস্বস্তিকর সমাপ্তি):

static bool exiting = false;

static void Main(string[] args)
{
   try
   {
      System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
      demo.Start();
      Console.ReadLine();
      exiting = true;
   }
   catch (Exception ex)
   {
      Console.WriteLine("Caught an exception");
   }
}

static void DemoThread()
{
   for(int i = 5; i >= 0; i--)
   {
      Console.Write("24/{0} =", i);
      Console.Out.Flush();
      Console.WriteLine("{0}", 24 / i);
      System.Threading.Thread.Sleep(1000);
      if (exiting) return;
   }
}

আপনি অ্যাপ্লিকেশনটি ছাড়ার আগে কিছু পরিষ্কার করার জন্য অন্য থ্রেডটি ব্যতিক্রম করার সময় কোনও থ্রেড ছাপানোর বিজ্ঞপ্তিটি পেতে পারেন, তবে যতক্ষণ আমি বলতে পারি, আপনি কনসোল অ্যাপ্লিকেশন থেকে এটি প্রয়োগ করতে পারেন না যদি আপনি ব্যতিক্রমটি পরিচালনা না করেন থ্রেড থেকে যা এটি কিছু অস্পষ্ট সঙ্গতিপূর্ণ বিকল্পগুলি ব্যবহার না করেই নিক্ষেপ করা হয় যাতে অ্যাপ্লিকেশনটি এটির সাথে নেটওয়ার্কে 1.x। এই কোডটি অন্য থ্রেডগুলি থেকে আসা ব্যতিক্রমগুলি কীভাবে সূচিত করা যায় তা প্রদর্শন করে, তবে এখনও অপ্রত্যাশিতভাবে শেষ হবে:

static bool exiting = false;

static void Main(string[] args)
{
   try
   {
      System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
      demo.Start();
      Console.ReadLine();
      exiting = true;
   }
   catch (Exception ex)
   {
      Console.WriteLine("Caught an exception");
   }
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
   Console.WriteLine("Notified of a thread exception... application is terminating.");
}

static void DemoThread()
{
   for(int i = 5; i >= 0; i--)
   {
      Console.Write("24/{0} =", i);
      Console.Out.Flush();
      Console.WriteLine("{0}", 24 / i);
      System.Threading.Thread.Sleep(1000);
      if (exiting) return;
   }
}

সুতরাং আমার মতে, এটি একটি কনসোল অ্যাপ্লিকেশনটিতে পরিচালনা করার সবচেয়ে পরিষ্কার উপায়টি নিশ্চিত করে যে প্রতিটি থ্রেডে রুট লেভেলে ব্যতিক্রম ব্যতিক্রম আছে:

static bool exiting = false;

static void Main(string[] args)
{
   try
   {
      System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
      demo.Start();
      Console.ReadLine();
      exiting = true;
   }
   catch (Exception ex)
   {
      Console.WriteLine("Caught an exception");
   }
}

static void DemoThread()
{
   try
   {
      for (int i = 5; i >= 0; i--)
      {
         Console.Write("24/{0} =", i);
         Console.Out.Flush();
         Console.WriteLine("{0}", 24 / i);
         System.Threading.Thread.Sleep(1000);
         if (exiting) return;
      }
   }
   catch (Exception ex)
   {
      Console.WriteLine("Caught an exception on the other thread");
   }
}

আপনি থ্রেড থেকে ব্যতিক্রম হ্যান্ডেল করতে হবে:

static void Main(string[] args) {
Application.ThreadException += MYThreadHandler;
}

private void MYThreadHandler(object sender, Threading.ThreadExceptionEventArgs e)
{
    Console.WriteLine(e.Exception.StackTrace);
}

হুপ, দুঃখিত যে Winforms এর জন্য ছিল, যে কোনও থ্রেড যা আপনি কনসোল অ্যাপ্লিকেশনে ব্যবহার করছেন তার জন্য আপনাকে একটি try / catch block এ ঘিরে ফেলতে হবে। অননুমোদিত ব্যতিক্রমগুলির সম্মুখীন হওয়া ব্যাকগ্রাউন্ড থ্রেডগুলি অ্যাপ্লিকেশনটিকে শেষ করতে দেয় না।


না, এটা করার সঠিক উপায়। এটি ঠিক যেমন কাজ করা উচিত ঠিক তেমনই, আপনি সম্ভবত এমন কিছু করতে পারেন:

using System;

class Program {
    static void Main(string[] args) {
        System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
        throw new Exception("Kaboom");
    }

    static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine(e.ExceptionObject.ToString());
        Console.WriteLine("Press Enter to continue");
        Console.ReadLine();
        Environment.Exit(1);
    }
}

মনে রাখবেন যে আপনি এই ভাবে জিতার দ্বারা তৈরি টাইপ এবং ফাইল লোড ব্যতিক্রমগুলি ধরতে পারবেন না। আপনার মুখ্য () পদ্ধতি চলতে শুরু করার আগে তারা ঘটবে। তাদের ধরার জন্য জিটার বিলম্বিত করতে, ঝুঁকিপূর্ণ কোডটিকে অন্য পদ্ধতিতে সরাতে হবে এবং [MethodImpl (MethodImplOptions.InInline)] এটিকে বৈশিষ্ট্যটি প্রয়োগ করুন।


আপনি যা চেষ্টা করছেন তা অবশ্যই .NET 2.0 এর জন্য MSDN ডক এর সাথে কাজ করা উচিত। আপনি কনসোল অ্যাপ্লিকেশনের জন্য আপনার এন্ট্রি পয়েন্টের চারপাশে মূলত চেষ্টা / ধরা চেষ্টা করতে পারেন।

static void Main(string[] args)
{
    try
    {
        // Start Working
    }
    catch (Exception ex)
    {
        // Output/Log Exception
    }
    finally
    {
        // Clean Up If Needed
    }
}

এবং এখন আপনার ধরা কিছু ধরা না ( প্রধান থ্রেড মধ্যে ) হ্যান্ডেল হবে। এটি দুর্দান্ত হতে পারে এবং যদি আপনি চান তবে এটি পুনরায় চালু করুন, অথবা আপনি অ্যাপ্লিকেশানটিকে মরাতে এবং ব্যতিক্রমটি লগ করতে দিতে পারেন। আপনি একটি পরিষ্কার আপ করতে চেয়েছিলেন যদি আপনি অবশেষে woul যোগ। প্রতিটি থ্রেড প্রধান অনুরূপ নিজস্ব উচ্চ স্তরের ব্যতিক্রম হ্যান্ডলিং প্রয়োজন হবে।

BlueMonkMN দ্বারা নির্দেশিত থ্রেড সম্পর্কে বিন্দুটি স্পষ্ট করার জন্য এবং তার উত্তরে বিস্তারিতভাবে দেখানো হয়েছে।





console-application