ডান সিনট্যাক্স ব্যবহার করে / ধরা + ব্যবহার করুন


189

কোনটি:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

অথবা

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}

7
কেবলমাত্র একটি নোট: লগিং বা এগুলি মোড়ানো ব্যতীত কেবলমাত্র ব্যতিক্রমগুলি হ্যান্ডেল করা (সংশোধন) করা যায় এমন বিষয়ে নজর রাখা উচিত ।
জন স্যান্ডার্স

1
দয়া করে মনে রাখবেন যে গত }এর usingবিবৃতি ব্যতিক্রম নিক্ষেপ করতে পারেন এখানে স্মরণ করিয়ে
জিউলিও ক্যাকিন

1
টিআইএল করুন যে আপনি কোডের প্রথম ব্লক ব্যবহার করলে ডিবাগার (ভিএস-তে) নিষ্পত্তি পদ্ধতিতে কল করবে না T যেহেতু ব্যবহারের বিবৃতিটি নিজেই একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে, এটি আমাকে অপ্রয়োজনীয় finallyনামক ডিসপোজ পদ্ধতিটি নিশ্চিত করতে দ্বিতীয় ব্লকটি ব্যবহার করতে সহায়তা করে ।
শুশশা

উত্তর:


98

আমি দ্বিতীয় পছন্দ। পাশাপাশি বস্তুর তৈরি সম্পর্কিত ফাঁদে ত্রুটিগুলিও ঘটতে পারে।


11
আমি এই পরামর্শের সাথে একমত নই। আপনি যদি অবজেক্ট তৈরির কোনও ত্রুটি ছুঁড়ে ফেলার আশা করছেন, তবে সেই ব্যতিক্রমের যে কোনও হ্যান্ডলিংয়ের অবশ্যই বাইরে যেতে হবে । হ্যান্ডলিংটি কোথায় যাওয়া উচিত সে সম্পর্কে যদি কিছু প্রশ্ন থাকে, তবে যে ব্যতিক্রমটি প্রত্যাশিত তা অবশ্যই অন্য কিছু হতে পারে — আপনি যদি এলোমেলো ব্যতিক্রম যা প্রত্যাশিত বা প্রত্যাশিত নাও হতে পারে তা ধরার পক্ষে পরামর্শ দিচ্ছেন না, যা একটি ক্লাসিক অ্যান্টি-প্যাটার্ন (কোনওটির বাইরে) প্রক্রিয়া বা থ্রেডের আনহ্যান্ডেল ব্যতিক্রম হ্যান্ডলার)।
জেফ্রি এল হুইলেটজ

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

আপনার উত্তর সঠিক হয় কিন্তু প্রস্তাবনা যে চেষ্টা / ধরা অব্যাহত রয়েছে সেখানে সব সময়ে (অবিলম্বে) যাবে।
হেনক হলটারম্যান

17
আমি মনে করি প্রথমটিরও যোগ্যতা রয়েছে, একটি ডিবি লেনদেন বিবেচনা করুন using( DBConnection conn = DBFactory.getConnection())যা ব্যতিক্রম ঘটলে আবার ফিরে আসতে হবে। আমার কাছে মনে হয় যে উভয়েরই জায়গা আছে।
wfoster

1
এটি বস্তুর নিষ্পত্তি সম্পর্কিত ত্রুটিগুলিও ফাঁদে ফেলবে ।
আহমদ ইব্রাহিম

39

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

MyClass myObject = null;
try {
  myObject = new MyClass();
  //important stuff
} catch (Exception ex) {
  //handle exception
} finally {
  if(myObject is IDisposable) myObject.Dispose();
}

4
আপনি কেন মনে করেন finallyযে কোনও usingবিবৃতি যুক্ত করার চেয়ে একটি ব্লক যুক্ত করা ভাল ?
কোডি গ্রে

10
finallyএকটি আইডিস্পোজযোগ্য অবজেক্টকে নিষ্পত্তি করে এমন একটি ব্লক যুক্ত করা একটি usingবিবৃতি যা করে। ব্যক্তিগতভাবে, আমি এম্বেডড usingব্লকের পরিবর্তে এটি পছন্দ করি কারণ আমার মনে হয় এটিকে আরও পরিষ্কারভাবে বলা হয়েছে যেখানে সমস্ত কিছু ঘটছে, এবং এটি সব একই "স্তরে" রয়েছে। আমি এটি বেশ কয়েকটি এম্বেড থাকা usingব্লকের চেয়েও বেশি পছন্দ করি ... তবে এটি কেবল আমার পছন্দ।
chezy525

8
আপনি যদি অনেক ব্যতিক্রম হ্যান্ডলিং বাস্তবায়ন করেন তবে আপনার অবশ্যই টাইপিং উপভোগ করতে হবে! এই "কীওয়ার্ড" কীওয়ার্ডটি কিছু সময়ের জন্য ছিল এবং এর অর্থটি আমার কাছে বেশ স্পষ্ট। এবং এটি ব্যবহার করে বিশৃঙ্খলার পরিমাণ সর্বনিম্ন রেখে আমার বাকী কোডগুলি আরও পরিষ্কার করতে সহায়তা করে।
জোনাথন উড

2
এটি ভুল। tryবিবৃতিটির মধ্যে নিষ্পত্তি করার জন্য অবজেক্টটি অবশ্যই বিবৃতিটির বাইরে তাত্ক্ষণিকভাবে আবশ্যক finally; অন্যথায়, এটি একটি সংকলক ত্রুটি নিক্ষেপ করবে: "নিরক্ষিত স্থানীয় ভেরিয়েবল 'মাইঅবজেক্ট'" "
স্টিভ কনভেস

3
প্রযুক্তিগতভাবে, এটিও সংকলন করবে না। Cannot assign null to implicitly-typed local variable;) তবে আমি জানি আপনি কী বোঝাতে চেয়েছেন এবং ব্যক্তিগতভাবে এটির ব্যবহার ব্লককে বাসা বাঁধার চেয়ে পছন্দ করবে।
কনেল

20

এটা নির্ভর করে. যদি আপনি উইন্ডোজ কমিউনিকেশন ফাউন্ডেশন (ডাব্লুসিএফ) ব্যবহার করে using(...) { try... }থাকেন তবে usingবিবৃতিতে প্রক্সিটি ব্যতিক্রম অবস্থায় থাকলে সঠিকভাবে কাজ করবে না , অর্থাৎ এই প্রক্সিটি ডিসপোজ করা অন্য ব্যতিক্রম ঘটায়।

ব্যক্তিগতভাবে, আমি ন্যূনতম হ্যান্ডলিং পদ্ধতির উপর বিশ্বাস করি, অর্থাত্ মৃত্যুদন্ড কার্যকর করার সময় আপনি কেবল অবগত হন handle অন্য কথায়, আপনি যদি জানেন যে কোনও ভেরিয়েবলের usingসূচনাটি কোনও বিশেষ ব্যতিক্রম ছুঁড়ে দিতে পারে তবে আমি এটিকে মুড়িয়ে রাখি try-catch। একইভাবে, যদি usingশরীরে কিছু ঘটে থাকে যা সরাসরি পরিবর্তকের সাথে সম্পর্কিত না হয় usingতবে আমি tryসেই বিশেষ ব্যতিক্রমের জন্য অন্যটির সাথে এটি আবৃত করি । আমি খুব কমই Exceptionআমার catchএস এ ব্যবহার করি ।

তবে আমি পছন্দ করি IDisposableএবং usingযদিও তাই আমি পক্ষপাতিত্ব করি।


19

যদি আপনার ক্যাচ স্টেটমেন্টটি কোনও ব্যবহারের বিবৃতিতে ঘোষিত চলকটি অ্যাক্সেস করার প্রয়োজন হয় তবে তার ভিতরে আপনার একমাত্র বিকল্প।

যদি আপনার ক্যাচ স্টেটমেন্টটি নিষ্পত্তি হওয়ার আগে ব্যবহারের ক্ষেত্রে রেফারেন্সের প্রয়োজন হয় তবে তার ভিতরে আপনার একমাত্র বিকল্প।

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

যখনই আমার এর মতো একটি দৃশ্যাবলী থাকে, ট্রাই-ক্যাচ ব্লকটি সাধারণত ব্যবহারের থেকে কল স্ট্যাকটি আরও আলাদা পদ্ধতিতে করা হয়। কোনও পদ্ধতির পক্ষে এটির মধ্যে এটির মতো ব্যতিক্রমগুলি কীভাবে পরিচালনা করা যায় তা পরিচালনা করা সাধারণ নয়।

সুতরাং আমার সাধারণ পুনঃব্যবস্থা বাহিরের বাইরে।

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}

10

উভয়ই বৈধ সিনট্যাক্স। এটি আপনি যা করতে চান তা আসলেই নেমে আসে: আপনি যদি বস্তুটি তৈরি / নিষ্পত্তি সম্পর্কিত ত্রুটিগুলি ধরতে চান তবে দ্বিতীয়টি ব্যবহার করুন। যদি না হয় তবে প্রথমটি ব্যবহার করুন।


8

এখানে একটি গুরুত্বপূর্ণ বিষয় রয়েছে যা আমি এখানে কল করব: প্রথমটি কনস্ট্রাক্টরকে কল করে কোনও ব্যতিক্রম ধরা পড়বে নাMyClass


3

সি # 8.0 থেকে, আমি দ্বিতীয়টির মতো এটি ব্যবহার করতে পছন্দ করি

public class Person : IDisposable
{
    public Person()
    {
        int a = 0;
        int b = Id / a;
    }
    public int Id { get; set; }

    public void Dispose()
    {
    }
}

এবং তারপর

static void Main(string[] args)
    {

        try
        {
            using var person = new Person();
        }
        catch (Exception ex) when
        (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
        ex.TargetSite.MemberType == System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Constructor Person");
        }
        catch (Exception ex) when
       (ex.TargetSite.DeclaringType.Name == nameof(Person) &&
       ex.TargetSite.MemberType != System.Reflection.MemberTypes.Constructor)
        {
            Debug.Write("Error Person");
        }
        catch (Exception ex)
        {
            Debug.Write(ex.Message);
        }
        finally
        {
            Debug.Write("finally");
        }
    }

1

আপনি যে ব্যবহারটি () ব্লকটিতে সূচনা করছেন তা যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনার দ্বিতীয় সিনট্যাক্সের জন্য যাওয়া উচিত অন্যথায় উভয়টি সমানভাবে বৈধ।

আমার দৃশ্যে, আমাকে একটি ফাইল খুলতে হয়েছিল এবং আমি অবজেক্টের কনস্ট্রাক্টারে ফাইলপথটি পাস করছি যা আমি ব্যবহার () ব্লকটিতে আরম্ভ করছি এবং যদি ফাইলপথটি ভুল / খালি থাকে তবে এটি ব্যতিক্রম হতে পারে। সুতরাং এই ক্ষেত্রে, দ্বিতীয় বাক্য গঠন বোধগম্য হয়।

আমার নমুনা কোড: -

try
{
    using (var obj= new MyClass("fileName.extension"))
    {

    }
}
catch(Exception ex)
{
     //Take actions according to the exception.
}

1

থেকে উপর সি # 8.0 , আপনি প্রক্রিয়া সহজ করতে usingকিছু অবস্থার অধীনে বিবৃতি নেস্টেড ব্লক পরিত্রাণ পেতে, এবং তারপর এটি শুধু এনক্লোজিং ব্লক ক্ষেত্রে প্রযোজ্য।

সুতরাং আপনার দুটি উদাহরণ হ্রাস করা যেতে পারে:

using var myObject = new MyClass();
try
{
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

এবং:

try
{
   using var myObject = new MyClass();
   // something here...
}
catch(Exception ex)
{
   // Handle exception
}

উভয়ই বেশ স্পষ্ট; এবং তারপরে যা আপনি বস্তুর ক্ষেত্রটি কী চান, যেখানে আপনি তাত্ক্ষণিক ত্রুটিগুলি পরিচালনা করতে চান এবং আপনি কখন তা নিষ্পত্তি করতে চান তা নিয়ে দুজনের মধ্যে পছন্দ হ্রাস করে।

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