অ্যাক্সেসভিওলেশন এক্সসেপশন কীভাবে পরিচালনা করবেন


183

আমি আমার। নেট অ্যাপ্লিকেশনটির মধ্যে থেকে একটি COM অবজেক্ট (MODI) ব্যবহার করছি। আমি যে পদ্ধতিতে কল করছি এটি একটি সিস্টেম.অ্যাক্সেসভিওলেশন এক্সসেপশন নিক্ষেপ করে যা ভিজ্যুয়াল স্টুডিওর দ্বারা বিরত থাকে। অদ্ভুত বিষয়টি হ'ল আমি আমার কলটি একটি ক্যাপ ক্যাচে আবদ্ধ করেছি, যার অ্যাক্সেসভিওলেশন এক্সসেপশন, সিএমএক্সেপশন এবং অন্য সব কিছুর জন্য হ্যান্ডলার রয়েছে, তবে যখন ভিজ্যুয়াল স্টুডিও (2010) অ্যাক্সেসভিওলিশন এক্সসেপশনকে বাধা দেয়, তখন ডিবাগারটি পদ্ধতি কল (ডক্ট.ওসিআর) এ বিরতি দেয়, এবং যদি আমি পাশ দিয়ে যাই তবে এটি ক্যাচ ব্লকে প্রবেশের পরিবর্তে পরবর্তী লাইনে অবিরত থাকবে। অতিরিক্ত হিসাবে, আমি যদি ভিজ্যুয়াল স্টুডিওর বাইরে এটি চালিত করি তবে আমার অ্যাপ্লিকেশন ক্র্যাশ হয়ে গেছে। COM অবজেক্টের মধ্যে ফেলে দেওয়া এই ব্যতিক্রমটিকে আমি কীভাবে পরিচালনা করতে পারি?

MODI.Document doc = new MODI.Document();
try
{
    doc.Create(sFileName);
    try
    {
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.AccessViolationException ex)
    {
        //MODI seems to get access violations for some reason, but is still able to return the OCR text.
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        //if no text exists, the engine throws an exception.
        sText = "";
    }
    catch
    {
        sText = "";
    }

    if (sText != null)
    {
        sText = sText.Trim();
    }
}
finally
{
    doc.Close(false);

    //Cleanup routine, this is how we are able to delete files used by MODI.
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
    doc = null;
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();

}

আপনি কি Exceptionসমস্ত ব্যতিক্রম ফাঁদে ফেলতে এবং ব্যতিক্রমটি আসলে কী তা দেখতে কোনও সাময়িকভাবে (সাময়িকভাবে!) কোনও হ্যান্ডলার লাগানোর চেষ্টা করেছেন ?
ক্রিসএফ

3
@ ক্রিসএফ - হ্যাঁ, শেষ ক্যাচ হ্যান্ডলারটি দেখুন? এটি ব্যতিক্রম এবং ব্যতিক্রমের যে কোনও সাবক্লাস সহ সমস্ত কিছু ধরা উচিত। পাশাপাশি, ভিজ্যুয়াল স্টুডিও জানিয়েছে যে ব্যতিক্রমটি সিস্টেম.অ্যাক্সেসভিওয়েলেশন এক্সসেপশন
জেরেমি

উত্তর:


299

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

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

তবে আশা আছে। এটিকে ঘুরে দেখার কয়েকটি উপায় রয়েছে:

  1. .NET 3.5 এ্যাসেম্বলি হিসাবে পুনরায় রচনা করুন এবং এটি নেট 4.0 তে চালান।

  2. কনফিগারেশন / রানটাইম উপাদানটির আওতায় আপনার অ্যাপ্লিকেশনটির কনফিগার ফাইলে একটি লাইন যুক্ত করুন: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. HandleProcessCorruptedStateExceptionsগুণাবলী সহ আপনি এই ব্যতিক্রমগুলি ধরতে চান এমন পদ্ধতিগুলি সাজান। বিশদ জানতে http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 দেখুন ।


সম্পাদনা

পূর্বে, আমি অতিরিক্ত তথ্যের জন্য একটি ফোরাম পোস্ট রেফারেন্স করেছি । মাইক্রোসফ্ট কানেক্ট যেহেতু অবসরপ্রাপ্ত হয়েছে, আপনার আগ্রহের ক্ষেত্রে অতিরিক্ত বিশদটি এখানে দেওয়া হল:

মাইক্রোসফ্ট সিএলআর টিমের বিকাশকারী গৌরব খান্না থেকে

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

তারপরে তিনি হ্যান্ডলপ্রসেস করপ্রেস্টস্টেট এক্সেক্সেশনসট্রিবিউট এবং উপরের নিবন্ধে ডকুমেন্টেশনগুলি উল্লেখ করতে যান । বলার অপেক্ষা রাখে না, আপনি যদি এই ধরনের ব্যতিক্রমগুলি ধরার বিষয়ে বিবেচনা করেন তবে তা অবশ্যই পঠনযোগ্য।


12
HandleProcessCorruptedStateExceptions.Net 4.5 এ আমার জন্য কাজ করে।
ডিয়ারচাও

2
ধন্যবাদ ভিলিকোডার, আপনি একজন রত্ন! আমি কয়েক সপ্তাহ ধরে এই সমস্যাটি মোকাবেলা করছি, মূল সমস্যাটি সমাধান করার চেষ্টা করছি এবং অবশেষে লক্ষণটির চিকিত্সা করার জন্য নিজেকে পদত্যাগ করেছি। আপনার সমাধান নিখুঁত।
gadildafissh

19
! সচেতন হওয়ার জন্য: অ্যাক্সেসভিওলেশন এক্সসেপশন যা দুর্নীতিগ্রস্থ রাজ্য ব্যতিক্রম (সিএসই) এর পরে প্রক্রিয়াটি শেষ করার জন্য অত্যন্ত সুপারিশ করা হয়। অন্যথায় এটি আরও জটিল ত্রুটি ঘটাতে পারে।
Zbigniew ওয়াইড্রো

6
ধন্যবাদ, এটি সত্যই সহায়ক, যদিও প্রথমে আমি এই ধারণাটি পেয়েছিলাম যে এই ব্যতিক্রমগুলি ধরতে সক্ষম হওয়ার জন্য আমাকে সমস্ত 3 টি পদক্ষেপ করা দরকার, যখন এটি আসলে এটি ORকরার উপায়গুলির একটি "যৌক্তিক "। :)
লু

@ ডিয়ারচাও আশা করি আপনি উত্তরে প্রদত্ত প্রথম লিঙ্কটি পড়েছেন। সিএসই ব্যতিক্রমগুলি পরিচালনা করা একটি খারাপ ধারণা।
পিক্সেল

17

কনফিগার ফাইলে নিম্নলিখিতগুলি যুক্ত করুন, এবং এটি ক্রিচ ব্লকটি ধরা পড়বে। সাবধানতার কথা ... এই পরিস্থিতি এড়াতে চেষ্টা করুন, কারণ এর অর্থ হ'ল একরকম লঙ্ঘন হচ্ছে।

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

2
যারা ডেল হিসাবে সি ++ / ক্লিপ ব্যবহার করেন তাদের জন্য শীর্ষ। এক্স প্রকল্পে কোডটি যুক্ত করা উচিত।
ফেলিক্স

9

উপরের উত্তরগুলি থেকে সংকলিত, আমার জন্য কাজ করেছে, এটি ধরার জন্য নিম্নলিখিত পদক্ষেপগুলি করেছে।

পদক্ষেপ # 1 - ফাইলটি কনফিগার করতে নিম্নলিখিত স্নিপেট যুক্ত করুন

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

ধাপ ২

যুক্ত করুন -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

ফাংশন শীর্ষে আপনি ব্যতিক্রম ধরা হয়

উত্স: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html


এমএসডিএন.মাইক্রোসফট.ইন- ইউস / লিবারি / to অনুসারে , সিকিউরিটিক্রিটিক্যালঅ্যাট্রিবিউট সম্পূর্ণ আস্থার লিঙ্ক চাহিদার সমতুল্য। আমি মনে করি না যে বর্ণিত সমস্যাটি পূর্ণ আস্থার দাবিতে প্রয়োজনীয়।
জেরেমি

0

আপনি অ্যাপডোমাইন ব্যবহার করার চেষ্টা করতে পারেন Uঅনন্দিত এক্সেক্সপশন এবং এটি আপনাকে এটি ধরতে দেয় কিনা তা দেখুন।

** সম্পাদনা *

এখানে আরও কিছু তথ্য কার্যকর হতে পারে (এটি একটি দীর্ঘ পঠিত)।


2
.NET ফ্রেমওয়ার্কে পরিবর্তনের কারণে এই উত্তরটি আর সম্পূর্ণ নির্ভুল নয়। 4.0 এর আগে এটি সঠিক is মধ্যে AccessViolationException এবং চেষ্টা / ধরা ব্লক অধ্যায় প্রতি msdn.microsoft.com/en-us/library/...
Tedford
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.