অ্যাপ্লিকেশন.ট্রেডএক্সসেপশন এবং অ্যাপডোমেন.কন্টেনডোমাইন.অনহেলডএক্সেপশন এর মধ্যে পার্থক্য কী?


107

ঠিক আছে, এটি একটি সহজ:

  • মধ্যে পার্থক্য কি Application.ThreadExceptionএবং
    AppDomain.CurrentDomain.UnhandledException?

  • আমার কি দুটোই সামলানো দরকার?

ধন্যবাদ!

উত্তর:


98

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

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

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

ফিউইউউ: "থ্রেডএক্সসেপশন" খুব খারাপ নাম পছন্দ ছিল। থ্রেডের সাথে এর কোনও যোগসূত্র নেই।


এবং কীভাবে উইনফোর্ডস অ্যাপ্লিকেশনটিকে সংঘটন থেকে আটকাতে হবে Application.ThreadException। আমি আমার ছোট সি # কোড দিয়ে এর জন্য [এখানে ] একটি প্রশ্ন উত্থাপন করেছি।
Mahesha999

2
উইনফর্মগুলি একটি থ্রেডে আবদ্ধ বলে আমি সর্বদা এটি অ্যাপ্লিকেশন-থ্রেড ব্যতিক্রম হিসাবে পড়ি।
গুডডর

36

উত্স থেকে :

উইন্ডোজ ফর্মগুলি ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিতে, মূল অ্যাপ্লিকেশন থ্রেডে আনহ্যান্ডেল ব্যতিক্রমগুলি Application.ThreadException ইভেন্টটিকে উত্থাপিত করে। যদি এই ইভেন্টটি পরিচালনা করা হয়, ডিফল্ট আচরণটি হ'ল হাতছাড়া ব্যতিক্রম অ্যাপ্লিকেশনটি শেষ করে না, যদিও অ্যাপ্লিকেশনটি অজানা অবস্থায় রেখে দেওয়া হয়েছে। সেক্ষেত্রে UnhandledException ঘটনাটি উত্থাপিত হয় না। অ্যাপ্লিকেশন কনফিগারেশন ফাইল ব্যবহার করে বা ইভেন্ট হ্যান্ডলারটি জড়িত হওয়ার আগে Application.SetUnhandledExceptionModeমোডটি পরিবর্তন করার পদ্ধতিটি ব্যবহার করে এই আচরণটি পরিবর্তন করা যেতে পারে । এটি কেবলমাত্র মূল অ্যাপ্লিকেশন থ্রেডের জন্য প্রযোজ্য। ঘটনা অন্যান্য থ্রেডের মধ্যে নিক্ষিপ্ত অপরিচালিত ব্যতিক্রম জন্য উত্থাপিত হয়।UnhandledExceptionMode.ThrowExceptionThreadExceptionUnhandledException

ভিজ্যুয়াল স্টুডিও ২০০৫ থেকে শুরু করে , ভিজ্যুয়াল বেসিক অ্যাপ্লিকেশন কাঠামোটি মূল অ্যাপ্লিকেশন থ্রেডে অপরিবর্তিত ব্যতিক্রমগুলির জন্য অন্য ইভেন্ট সরবরাহ করে - WindowsFormsApplicationBase.UnhandledException। এই ইভেন্টটিতে অ্যাপডোমাইন দ্বারা ব্যবহৃত ইভেন্ট আর্গুমেন্ট অবজেক্ট হিসাবে একই নামে একটি ইভেন্ট আর্গুমেন্ট অবজেক্ট রয়েছে Uহানডেলড এক্সসেপশন, তবে বিভিন্ন বৈশিষ্ট্য সহ। বিশেষত, এই ইভেন্টের আর্গুমেন্টের অবজেক্টের এমন একটি ExitApplicationসম্পত্তি রয়েছে যা অ্যাপ্লিকেশনটি চালিয়ে যেতে দেয়, অযাচিত ব্যতিক্রম উপেক্ষা করে (এবং অ্যাপ্লিকেশনটিকে অজানা অবস্থায় রেখে দেয়)। সেক্ষেত্রে AppDomain.UnhandledException ইভেন্ট উত্থাপিত হয় না।

Application.ThreadExceptionধরা পড়তে পারে এবং অ্যাপ্লিকেশনটি চালিয়ে যেতে পারে (সাধারণভাবে একটি দুর্দান্ত ধারণা নয়, তবে পর্যায়ক্রমে কিছু ক্রিয়া চালানোর মতো অ্যাপ্লিকেশনটির জন্য এটি একটি ভাল সমাধান)।

উইন্ডোজ ফর্মগুলির মালিকানাধীন এবং মালিকানাধীন থ্রেডগুলিতে ঘটে যাওয়া ব্যতিক্রমগুলি ধরার জন্য এটি ব্যবহার করুন AppDomain.UnhandledException। সিস্টেম ডিফল্ট হ্যান্ডলার ব্যবহারকারীর ব্যতিক্রমটির প্রতিবেদন করে এবং অ্যাপ্লিকেশনটি সমাপ্ত করার আগে এটি অ্যাপ্লিকেশনটিকে ব্যতিক্রম সম্পর্কিত তথ্য লগ করতে দেয়।
এই ব্যতিক্রম হ্যান্ডলিং অ্যাপ্লিকেশন শেষ হতে বাধা দেয় না।
সর্বাধিক যা করা সম্ভব হয়েছিল (ব্যতিক্রমগুলি পরিচালনা না করা হলে প্রোগ্রামের ডেটাগুলি কলুষিত হতে পারে) পরে পুনরুদ্ধারের জন্য প্রোগ্রামের ডেটা সংরক্ষণ করা হয়। এর পরে অ্যাপ্লিকেশন ডোমেনটি লোড হয় এবং অ্যাপ্লিকেশনটি সমাপ্ত হয়।

.NET 4 দিয়ে শুরু করে, ইভেন্টটি হ্যান্ডলারটি সুরক্ষামূলক-সমালোচনা না করা এবং বৈশিষ্ট্য না থাকলে প্রক্রিয়াটির অবস্থা যেমন স্ট্যাক ওভারফ্লোস বা অ্যাক্সেস লঙ্ঘনকে দূষিত করে, এই ইভেন্টটি উত্থাপিত হয় না HandleProcessCorruptedStateExceptionsAttribute

আরও তথ্যের জন্য, এমএসডিএন দেখুন


18

ঠিক আছে - আমার সামনে এটি ছিল, এমএসডিএন থেকে এই বিট কোডটি বেশ স্ব- বর্ণনামূলক :

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

3
এটি সিরিহির অন্যান্য উত্তরের সাথে বিপরীত: যখন তিনি বলেছেন: আনহানডেলড এক্সসেপশন মোড T আদেশটি সত্যিই গুরুত্বপূর্ণ কিনা তা নিশ্চিত নয় ...
ডেভিড পিরাস

@ ডেভিডপিরস হ্যাঁ, এবং আরও কিছু জটিল আছে। সেটআপহ্যান্ডেলড এক্সেকশনটি আমার ক্ষেত্রে কোনও তাত্পর্যপূর্ণ বলে মনে হচ্ছে না।
নওফাল

0

ভাল কথাটি হ'ল, ThreadExceptionআপনার থ্রেডে কোনও সমস্যার কারণে ঘটে, Unhandled Exceptionযদি আপনি কোডটি কোনও ব্যতিক্রম ছুঁড়ে দেন যা পরিচালনা করা হয় না fired

দ্বিতীয়টির কারণ হওয়ার সহজ উপায় হ'ল কোনও চেষ্টা ছাড়াই একটি অ্যাপ তৈরি করা ... ব্লক ধরুন এবং একটি ব্যতিক্রম ছুঁড়ে দিন।

এখন আপনার যদি বীমা প্রয়োজন হয় তবে আপনি সেগুলি উভয়ই পরিচালনা করতে পারেন, তবে আপনি যদি exceptionsসঠিকভাবে ক্যাপচার করেন এবং পরিচালনা করেন তবে আপনার UnhandledExceptionহ্যান্ডলারের প্রয়োজন হবে না কারণ এটি সমস্ত ধরণের ধরার মতো।


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