উইনফোর্স অ্যাপ্লিকেশনটিতে সমস্ত 'হাতছাড়া' ব্যতিক্রমগুলি ধরা যায় এমন কীভাবে আমি করব?


87

এখন পর্যন্ত, আমি শুধু একটি ব্যবহার করে দেখুন / ধরা ব্লক কাছাকাছি রাখা Application.Runমধ্যে Program.csপ্রোগ্রাম এন্ট্রি পয়েন্ট। এটি ডিবাগ মোডে সমস্ত ব্যতিক্রম ভালভাবে ধরেছে, কিন্তু আমি যখন ডিবাগ মোড ছাড়াই প্রোগ্রামটি চালাই, ব্যতিক্রমগুলি আর হ্যান্ডেল হয় না। আমি আনহ্যান্ডেল ব্যতিক্রম বাক্সটি পাই।

আমি এটা চাই না। আমি চাই যে নন-ডিবাগ মোডে চলাকালীন সমস্ত ব্যতিক্রম ধরা পড়ে। প্রোগ্রামটির একাধিক থ্রেড রয়েছে এবং তাদের থেকে সমস্ত ব্যতিক্রম একই হ্যান্ডলার দ্বারা ধরা পড়ে; আমি ডিবিতে ব্যতিক্রমগুলি লগ করতে চাই। এটি করার জন্য কারও কি কোনও পরামর্শ আছে?

উত্তর:


112

থ্রেডএক্সেপশন ডকুমেন্টেশন থেকে উদাহরণটি একবার দেখুন :

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);
}

ডিবাগ করার সময় আপনি ব্যতিক্রমগুলিও ধরতে চাইতে পারেন, কারণ এটি ডিবাগ করা সহজ করে। এটি কিছুটা হ্যাক, তবে এর জন্য আপনি উপরের কোডটি চারপাশে মোড়ানো করতে পারেন

 if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... }

ডিবাগ করার সময় ব্যতিক্রম ধরা আটকাতে।


4
আমি একটি পটভূমি কর্মী করেছি এবং ডোরক ইভেন্ট ইভেন্টে আমি ইচ্ছাকৃতভাবে একটি নাল রেফারেন্স ব্যতিক্রম করেছি। তবে এটি সেট করা সত্ত্বেও এটি অ্যাপডোমাইন.কর্মনডোমেন.অনহানডেলড এক্সসেপশনটির দ্বারা ধরা পড়েনি: অ্যাপ্লিকেশন.ট্রেডএক্সেপশন + = নতুন সিস্টেম।ট্রেডিং T থ্রেডএক্সেপশনEventHandler (অ্যাপ্লিকেশন_প্রাচ এক্সেপশন); অ্যাপ্লিকেশন.সেটহানডেলড এক্সসেপশনমোড (আনহানডেলড এক্সসেপশনমড.ক্যাচ এক্সেপশন); অ্যাপডোমাইন.কন্টেনডোমাইন.অনহ্যান্ডলড এক্সেক্সশন + = নতুন আনহানডেলড এক্সসেপশনএভেন্টহ্যান্ডলার (কারেন্টডোমাইন_উনহ্যান্ডলএক্সেপশন);
আইজাক বলিঞ্জার

4
@ আইসাকবি, ব্যাকগ্রাউন্ড কর্মীরা ব্যতিক্রম নিজেই ধরবে। আপনি রানওর্কার কমপ্লিটড এমনকি এমনকি রানকম্পটেডএভেন্টআর্গস.এররর সম্পত্তি দেখে ব্যতিক্রমগুলি পরীক্ষা করতে পারেন।
জেনার

4
আপনি এটিকে আপনার মূল ফর্মের অন্লোডে রেখে অতিরিক্ত থ্রেডের জন্য ব্যতিক্রম হ্যান্ডলিং পরীক্ষা করতে পারেন। নতুন থ্রেড (() => {নিক্ষেপ নতুন ব্যতিক্রম ();}) Start
Gencer

দুর্ভাগ্যক্রমে
আনহ্যান্ডেলড এক্সসেপশন

7
ফ্রেন্ডলি নাম.এন্ডস হ্যাকের পরিবর্তে, ডিবাগার.আইএসএটাচড চেষ্টা করুন যা ক্লিনার।
মল্টেনফর্ম

27

নেট 4-এ, কিছু ব্যতিক্রম ডিফল্টরূপে ধরা পড়ে না; এগুলি ব্যতিক্রম হতে থাকে যা এক্সিকিউওয়েলেশন এক্সসেপশন হিসাবে এক্সিকিউটেবলের একটি (সম্ভবত মারাত্মক) দূষিত অবস্থা নির্দেশ করে।

আপনার মূল পদ্ধতির সামনে [হ্যান্ডলপ্রসেসকর্প্রেস্ট স্টেটএক্সেপশনস] ট্যাগটি ব্যবহার করে দেখুন eg

using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions

[HandleProcessCorruptedStateExceptions]
public static int Main()
{
    try
    {
        // Catch any exceptions leaking out of the program
        CallMainProgramLoop();
    }
    catch (Exception e) // We could be catching anything here
    {
        System.Console.WriteLine(e.Message);
        return 1;
    }
    return 0;
  } 

আমি ব্যবহার করতে পারি AppDomain.CurrentDomain.UnhandledExceptionএবং Application.ThreadExceptionখুব সঙ্গে [HandleProcessCorruptedStateExceptions]ট্যাগ?
কুইকিনেট

18

একটি চমৎকার উদাহরণ পাওয়া যাবে http://www.csharp-example.net/catching-unhandled-exception/ মূলত, আপনার মূলটি এতে পরিবর্তন করুন:

static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        Application.Run(new Form1());
    }

    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
    }

9

আপনি এটির জন্য এনবুগ লাইব্রেরি ব্যবহার করতে পারেন । এর মতো ন্যূনতম সেটআপ সহ:

NBug.Settings.Destination1 = "Type=Mail;From=me@mycompany.com;To=bugtracker@mycompany.com;SmtpServer=smtp.mycompany.com;";
AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException;
Application.ThreadException += NBug.Handler.ThreadException;

ক্লায়েন্টদের কাছে নিযুক্ত থাকা সত্ত্বেও আপনি আপনার অ্যাপ্লিকেশনটিতে সমস্ত অপ্রচলিত বাগের তথ্য সংগ্রহ শুরু করতে পারেন। আপনি যদি কোনও তৃতীয় পক্ষের গ্রন্থাগার ব্যবহার করতে না চান তবে আপনার নীচের ইভেন্টগুলিতে সংযুক্ত করা উচিত:

// These two should come before enabling visual styles or running the application
AppDomain.CurrentDomain.UnhandledException += ...
Application.ThreadException += ...
...
Application.Run(new Form1());

4
আপনাকে স্বাগতম. আপনার যদি আরও প্রশ্ন থাকে তবে এনবুগ প্রকল্প আলোচনার ফোরামটি ব্যবহার করুন ( nbusy.com/forum/f11 ) বা [nbug] ট্যাগটি এখানে ব্যবহার করুন।
তেওমন সইগুল

অবশ্যই, আপনি আনহ্যান্ডলেড এক্সেপশন ইভেন্টে একটি "নিয়মিত" ইভেন্ট হ্যান্ডলারটিও সাবস্ক্রাইব করতে পারেন। দেখুন msdn.microsoft.com/en-us/library/...
neo2862

উইন 7 + ভিএস 10-এ বলছি, আমি যদি এই ইভেন্টগুলিতে সাবস্ক্রাইব করি তবে সাবস্ক্রিপশনটি চালিত হয় না, এর পরিবর্তে নিয়মিত উইন্ডোজ ভিস্তা / 7 ডায়ালগ প্রদর্শিত হয় Check Online for a Solutionবা Close the Program.. ইত্যাদি। তবে আমি সাবস্ক্রাইব না করলে আমি নিয়মিত জেনেরিক পাই। নেট আনহানডেল ব্যতিক্রম জানলা. এটি রিলিজ এবং ডিবাগ উভয়ই নির্মাণের ক্ষেত্রে ঘটে, সেটিংস চেষ্টা করেও Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);কিছু পরিবর্তন হয় না।
জিডিয়ন

@ জিডি, ব্যতিক্রমগুলি পরিচালনা করার পরে আপনার পরিবেশের সাথে অ্যাপ্লিকেশনটি প্রস্থান করা উচিত x এক্সিট (1); আপনি যদি ত্রুটি উইন্ডো প্রদর্শিত না চান।
তেওমন সায়গুল

@ আপনার উত্তরের জন্য ধন্যবাদ। আমি আমার নিজের ত্রুটি ফর্মটি প্রদর্শিত হতে চাই এবং তারপরে আমি অ্যাপটি প্রস্থান করতে চাই। তবে ইভেন্টের সাবস্ক্রিপশনটি কখনই চলবে না, ব্যতিক্রম দেখা দিলে এটি জেনেরিক উইন ভিস্তা / 7 ডায়ালগটি দেখায়। তবে আমি যদি জেনেরিক সাবস্ক্রাইব না করি তবে নেট নেট হ্যান্ডলড ব্যতিক্রম সংলাপটি উপস্থিত হয়!
জিডিয়ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.